什么是第三方授权登录,就是一些大家都会有的帐号如QQ、微信、淘宝、微博等账户。通过那些巨头公司提供的api直接实现登录。

当然,我们是不可能得到你的用户名和密码的。不了解的人,可能会存在这个疑虑。我们可以通过第三方授权登录得到如昵称、性别、注册地址、年龄、头像等基本信息。当然,我们也可以得到你账户因为的唯一编码,就是OAuthId。什么是OAuth技术?大家自行了解,这里就不细讲了。

准备资料:

各平台相关授权appid以及appkey(新浪为App Secret)

申请地址:

新浪

申请入口  http://open.weibo.com/connect

开发文档 http://open.weibo.com/wiki/%E7%BD%91%E7%AB%99%E6%8E%A5%E5%85%A5

腾讯QQ

申请入口:http://connect.qq.com/

开发文档  http://wiki.connect.qq.com/

微信

申请入口https://open.weixin.qq.com/

开发文档 https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&lang=zh_CN

以QQ为例:

从以上文档中可以得知,获得openId以及QQ获得用户信息需要三步,第一步,封装请求链接,然后服务的返回浏览器302跳转至微信或QQ等用户授权窗口

 public ActionResult QQLogin(string returnUrl)
{
AuthenticationScope scope=new AuthenticationScope(){
State=Guid.NewGuid().ToString().Replace("-", ""),
Scope="get_user_info"
};
if (!string.IsNullOrEmpty(returnUrl))
{
Session["returnUrl"] = returnUrl;
}
Session["requeststate"] = scope.State;
string url=_tencentHandler.GetAuthorizationUrl(scope);
return Redirect(url);
}
 public override string GetAuthorizationUrl(AuthenticationScope scope)
{
string url = string.Empty;
if (string.IsNullOrEmpty(scope.Scope))
{
url = string.Format("{0}/oauth2.0/authorize?response_type=code&client_id={1}&redirect_uri={2}&state={3}", _options.AuthorizeUrl, _options.AppId, string.Concat(_options.Host, _options.Callback), scope.State);
}
else
{
url = string.Format("{0}/oauth2.0/authorize?response_type=code&client_id={1}&redirect_uri={2}&state={3}&scope={4}", _options.AuthorizeUrl, _options.AppId, Uri.EscapeDataString(string.Concat(_options.Host, _options.Callback)), scope.State, scope.Scope);
}
return url;
}

成功后浏览器会跳转至

redirect_uri传递的链接窗口即QQOAuthController下面的CallBack

public ActionResult CallBack()
{
var verifier = Request.Params["code"];
string state = Session["requeststate"].ToString();
QQAuthenticationTicket ticket = new QQAuthenticationTicket()
{
Code=verifier,
Tag = "Tencent.QQ"
};
ticket = _tencentHandler.PreAuthorization(ticket);
ticket = _tencentHandler.AuthenticateCore(ticket);
UserClaim userClaim = getUserClaimByOpenIdOrUnionId(ticket.OpenId, "", ticket.Tag);
if (userClaim != null)
{
FormsAuthentication.SetAuthCookie(userClaim.User.UserName, true);
if (Session["returnUrl"] != null && string.IsNullOrEmpty(Session["returnUrl"].ToString()))
{
return Redirect(Session["returnUrl"].ToString());
}
return RedirectToAction("Index", "Home");
}
SocialUser user = _tencentHandler.GetUserInfo(ticket);
Session["social.current"] = user;
return RedirectToAction("social", "members");
}

这方法的主要作用是依据返回的code,与Authorization Server即(QQ或者微博)进行授权认证,获取token,依据token获取openId以及微信的unionId等张华信息

 public override QQAuthenticationTicket PreAuthorization(QQAuthenticationTicket ticket)
{
string tokenEndpoint = string.Concat(_options.AuthorizeUrl, "/oauth2.0/token?grant_type=authorization_code&client_id={0}&client_secret={1}&code={2}&redirect_uri={3}");
var url = string.Format(
tokenEndpoint,
Uri.EscapeDataString(_options.AppId),
Uri.EscapeDataString(_options.AppSecret),
Uri.EscapeDataString(ticket.Code), Uri.EscapeDataString(string.Concat(_options.Host, _options.Callback)));
string tokenResponse = _httpClient.GetStringAsync(url).Result.ToString();
if (tokenResponse.IndexOf('&') > )
{
var parameters = tokenResponse.Split('&');
foreach (var parameter in parameters)
{
var accessTokens = parameter.Split('=');
if (accessTokens[] == "access_token")
{
ticket.AccessToken = accessTokens[];
}
else if (accessTokens[] == "refresh_token")
{
ticket.RefreshToken = accessTokens[];
} }
}
return ticket;
}
 public override QQAuthenticationTicket AuthenticateCore(QQAuthenticationTicket ticket)
{
string tokenEndpoint = string.Concat(_options.AuthorizeUrl, "/oauth2.0/me?access_token={0}");
var url = string.Format(
tokenEndpoint,ticket.AccessToken);
string tokenResponse = _httpClient.GetStringAsync(url).Result.ToString();
string strJson = tokenResponse.Replace("callback(", "").Replace(");", "");
var payload = JsonHelper.DeserializeObject<Callback>(strJson);
ticket.OpenId=payload.openid;
return ticket;
}

执行到这里时应该已经获取到openId以及token等相关信息,在自身服务器的用户管理中查找这个账户的绑定记录,如果有相关信息依据取出的相关信息进行用户授权写入cookie或者其他操作,如无调用Authorization Server的相关接口获取相关信息,用QQ的昵称头像,新浪微博貌似无法获取相关信息

protected UserClaim getUserClaimByOpenIdOrUnionId(string openId, string unionId, string tag)
{
UserClaim claim = MembershipService.GetExtendSocialByOpenId(openId, tag);
if (claim != null)
{
return claim;
}
return MembershipService.GetExtentSocialByUnionId(unionId, tag);
}
UserClaim为第三方账户的相关信息类
 public class UserClaim
{
/// <summary>
/// 用户Id
/// </summary>
public int Id { get; set; }
/// <summary>
/// 用户Id
/// </summary>
public int UserId { get; set; }
/// <summary>
/// 用户认证类型
/// </summary>
public string Tag { get; set; }
/// <summary>
/// OpenId
/// </summary>
public string OpenId { get; set; }
/// <summary>
/// UnionId
/// </summary>
public string UnionId { get; set; }
/// <summary>
/// Token
/// </summary>
public string Token { get; set; }
/// <summary>
/// RefreshToken
/// </summary>
public string RefreshKey { get; set; }
public virtual MembershipUser User { get; set; } }
其他类似
最后附上相关代码https://github.com/491134648/Farmer.Social

ASP.NET MVC应用程序中支持用户使用腾讯QQ和微信以及新浪微博的第三方登录的更多相关文章

  1. 在ASP.NET MVC应用程序中实现Server.Transfer()类似的功能

    在ASP.NET MVC应用程序中,如果使用Server.Transfer()方法希望将请求转发到其它路径或者Http处理程序进行处理,都会引发“为xxx执行子请求时出错”的HttpException ...

  2. 在ASP.NET MVC应用程序中随机获取一个字符串

    在开发ASP.NET MVC应用程序时,有可能需要一个随机字符串,作为密码或是验证码等. 如果你需要的是SQL版本,可以参考<密码需要带特殊字符(二)>http://www.cnblogs ...

  3. 连接弹性和命令拦截的 ASP.NET MVC 应用程序中的实体框架

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    上篇博客我们学习了EF 之 MVC 排序,查询,分 ...

  4. 为ASP.NET MVC应用程序使用高级功能

    为ASP.NET MVC应用程序使用高级功能 这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译, ...

  5. 使用区域组织 ASP.NET MVC 应用程序

    MVC 模式可将应用程序的模型(数据)逻辑与其呈现逻辑和业务逻辑分离. 在 ASP.NET MVC 中,这种逻辑分离还在项目结构中以物理方式实现,在该项目结构中,控制器和视图保存在使用命名约定定义关系 ...

  6. ASP.NET MVC应用程序展示RDLC报表

    原文:ASP.NET MVC应用程序展示RDLC报表 学习ASP.NET MVC这样久,在学习,练习与应用过程中,觉得很多知识与以前的ASP.NET多有区别,但是实现操作起来,细处又有许多相近的地方. ...

  7. ASP.NET MVC开发学习过程中遇到的细节问题以及注意事项

    1.datagrid中JS函数传值问题: columns: { field: 'TypeName', title: '分类名称', width: 120, sortable: true, format ...

  8. 在MVC应用程序中,怎样删除上传的文件

    在ASP.NET MVC应用程序中,怎样删除上传的文件. 由于上传时,真正文件是存储在应用程序某一目录,在数据库表中,只是存储其基本信息.在删除时,需要注意一下,由于没有事务可操作.Insus.NET ...

  9. ASP.NET Core MVC应用程序中的后台工作任务

    在应用程序的内存中缓存常见数据(如查找)可以显着提高您的MVC Web应用程序性能和响应时间.当然,这些数据必须定期刷新. 当然你可以使用任何方法来更新数据,例如Redis中就提供了设定缓存对象的生命 ...

随机推荐

  1. 【BZOJ4868】期末考试(整数三分)

    题意: 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天 或之前得知所.有.课程的成绩.如果在第ti天,有至少一门课程的成绩没有公布,他就会等待 ...

  2. Linux下汇编语言学习笔记15 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  3. ZOJ 2770_Burn the Linked Camp

    题意: 给定每个兵营的最大容量,以及第i到第j个兵营至少有多少个士兵,问所有兵营一共至少有多少个士兵? 分析: 差分约束系统,注意 第i到第j至少有k个 第i到第j最多有最大容量之和个 每个兵营至少有 ...

  4. [bzoj2561]最小生成树_网络流_最小割_最小生成树

    最小生成树 bzoj-2561 题目大意:题目链接. 注释:略. 想法: 我们发现: 如果一条权值为$L$的边想加入到最小生成树上的话,需要满足一下条件. 就是求出原图的最小生成树之后,这个边当做非树 ...

  5. 记一次springMVC的跨域解决方案

    日期:2019年5月18日 事情原因:由于微信小程序的开发只有测试环境,而后台提供借口的环境是开发环境:两个环境的域名不同,导致前端开发产生了跨域问题: 理论概念: 1.同源策略:同源策略是浏览器的安 ...

  6. SAS编程基础 - 逻辑库和数据集

    1. SAS逻辑库 1.1 创建SAS逻辑库: libname lb 'F:\Data_Model'; libname是关键字,lb是创建的逻辑库的名称,引号内的内容是目录路径,最后一个分号结束程序语 ...

  7. UML基础与应用总结

          敲响一段键盘的乐响曲,一段路程留下一些足迹.       UML.是Unified-Modeling-Language的缩写. 首先要明白知道它是一种可视化的建模语言.   什么是UML基 ...

  8. 斜率优化专题1——bzoj 1597 [Usaco2008 Mar] 土地购买 题解

    转载请注明:http://blog.csdn.net/jiangshibiao/article/details/24387147 [原题] 1597: [Usaco2008 Mar]土地购买 Time ...

  9. Android架构的简单探讨(一)

    在CSDN上看到这样一篇译文,虽然最终的解决方案要按照自己特定的项目去设计,但该文还是引起了很多自己的共鸣,原文猛戳这里. 这是他提出的基于Messaging的MVC框架: 其中包含的设计思想在于:哪 ...

  10. Python开发【面向对象编程】

    一.概述 面向过程:根据业务逻辑从上到下,完成代码: 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可: 面向对象:对函数进行分类和封装. 二.面向对象 1.类.对象.方法.实例 ...