OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。

QQ登录OAuth2.0:对于用户相关的OpenAPI(例如获取用户信息,动态同步,照片,日志,分享等),为了保护用户数据的安全和隐私,第三方网站访问用户数据前都需要显式的向用户征求授权。 
QQ登录OAuth2.0采用OAuth2.0标准协议来进行用户身份验证和获取用户授权,相对于之前的OAuth1.0协议,其认证流程更简单和安全。具体参考文档 :【QQ登录】OAuth2.0开发文档

QQ互联网站已经提供了PHP,JS,Android和iOS的SDK,缺少.NET版本的SDK,春节假期期间利用一些空闲时间封装了一个具有完全功能的.NET SDK,后续将封装一个对应的Windows Phone的SDK,并开源放在http://opensns.codeplex.com ,专门搭建了一个示例网站http://www.win8charm.com/ 和MSDN风格的在线帮助网站http://help.win8charm.com/ 。今天这篇文章主要介绍使用.NET SDK实施QQ登陆功能。

从这里http://opensns.codeplex.com/ 下载最新版本的SDK,最新版本是Beta, 完成SDK的封装,希望大家使用帮忙测试,SDK依赖于Newtonsoft.Json和RestSharp两个程序集,具体可以参考使用RestSharp 库消费Restful Service。 主要是两个类QzoneContext(QQ登陆的上下文数据)  和 QOpenClient (QQ互联API入口),其他类主要是模型,配置类。

1、你得去http://connect.qq.com/ 申请一个账号,会得到一个APP ID和App Key,这两个东东会在生成请求的时候用到。你的去填一些资料,还要提交一些资料审核。

在配置文件web.config加入QQ登陆所需要的一些配置参数,如下图所示:

<configuration>
  <configSections>
    <sectionGroup name="QQSectionGroup">
      <section name="QzoneSection" type="System.Configuration.NameValueSectionHandler,System, Version=4.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089" />
    </sectionGroup>
  </configSections>
   <QQSectionGroup>
    <QzoneSection>
      <add key="AppKey" value="" />
      <add key="AppSecret" value="" />
      <add key="CallBackURI" value="" />
      <add key="AuthorizeURL" value="https://graph.qq.com/oauth2.0/authorize" />
    </QzoneSection>
  </QQSectionGroup>

AppKey是申请QQ登录成功后,分配给应用的appid;AppSecret是申请QQ登录成功后,分配给网站的appkey;CallBackURI是QQ登陆成功后的回调地址:AuthorizeURL是QQ互联的OAth2认证地址:

2、在项目中添加三个引用Newtonsoft.Json.dll、RestSharp.dll和 QConnectSDK.dll, 在页面上放置按钮,打开qq登录的页面,然后登录成功之后回调您的网站的页面。此时如果用户在你的网站有账号,那就可以绑定现有账号,或者新注册一个账号。如果你是新建站,也可以完全使用qq登录来作为用户体系。

下面上代码:

/// <summary> 
        /// QQ登陆页面 
        /// </summary>

[HttpGet] 
       public ActionResult Login(string returnUrl) 
       { 
           this.Session[RETURNURL] = returnUrl; 
           var context = new QzoneContext(); 
           string state = Guid.NewGuid().ToString().Replace("-", ""); 
           Session["requeststate"] = state; 
           string scope = "get_user_info,add_share,list_album,upload_pic,check_page_fans,add_t,add_pic_t,del_t,get_repost_list,get_info,get_other_info,get_fanslist,get_idolist,add_idol,del_idol,add_one_blog,add_topic,get_tenpay_addr";
           var authenticationUrl = context.GetAuthorizationUrl(state, scope); 
           return new RedirectResult(authenticationUrl);

}

/// <summary> 
        /// 回调页面 
        /// </summary>

public ActionResult QQConnect(LoginModel model) 
       { 
           if (Request.Params["code"] != null) 
           { 
               QOpenClient qzone = null;

var verifier = Request.Params["code"]; 
               var state = Request.Params["state"]; 
               string requestState = Session["requeststate"].ToString();

if (state == requestState) 
               { 
                   qzone = new QOpenClient(verifier, state); 
                   var currentUser = qzone.GetCurrentUser(); 
                   if (this.Session["QzoneOauth"] == null) 
                   { 
                       this.Session["QzoneOauth"] = qzone; 
                   } 
                   var friendlyName = currentUser.Nickname;

var isPersistentCookie = true; 
                   SetAuthCookie(qzone.OAuthToken.OpenId, isPersistentCookie, friendlyName);

return Redirect(Url.Action("Index", "Home")); 
               }


           return View(); 
       }

上面的代码是ASP.NET MVC的,项目示例运行在http://www.win8charm.com/ ,下面贴个ASP.NET WebForm的代码示例:

QQ登陆页面

namespace OpenConnect.WebSample.Account 

    public partial class LoginToQQ : System.Web.UI.Page 
    { 
        protected void Page_Load(object sender, EventArgs e) 
        { 
            GetRequestToken(); 
        }

private void GetRequestToken() 
        { 
            var context = new QzoneContext(); 
            string state = Guid.NewGuid().ToString().Replace("-", ""); 
            string scope = "get_user_info,add_share,list_album,upload_pic,check_page_fans,add_t,add_pic_t,del_t,get_repost_list,get_info,get_other_info,get_fanslist,get_idolist,add_idol,del_idol,add_one_blog,add_topic,get_tenpay_addr";
            var authenticationUrl = context.GetAuthorizationUrl(state,scope); 
            //request token, request token secret 需要保存起来 
            //在demo演示中,直接保存在全局变量中.真实情况需要网站自己处理 
            Session["requeststate"] = state;           
            Response.Redirect(authenticationUrl);


    } 
}

回调页面

namespace OpenConnect.WebSample.Account 

    public partial class QQCallback : System.Web.UI.Page 
    { 
        protected void Page_Load(object sender, EventArgs e) 
        { 
            if (Request.Params["code"] != null) 
            { 
                QOpenClient qzone = null; 
                User currentUser = null;

var verifier = Request.Params["code"]; 
                string state = Session["requeststate"].ToString(); 
                qzone = new QOpenClient(verifier, state); 
                currentUser = qzone.GetCurrentUser(); 
                if (null != currentUser) 
                { 
                    this.result.Text = "成功登陆"; 
                    this.Nickname.Text = currentUser.Nickname; 
                    this.Figureurl.ImageUrl = currentUser.Figureurl; 
                } 
                Session["QzoneOauth"] = qzone;

}

}

}

这里说明一下使用QQ互联登陆是获取不到用户的QQ号的,只会获取到用户的OpenId,OpenID和QQ号是一一对应关系。

参考网站:http://www.dandanxiaoshuo.com/

关注下面的微信公众账号进行测试: 扫描一下

本地测试
  • 前提准备,了解本地Host文件的作用
  1. 找到C:\WINDOWS\system32\drivers\etc\hosts这个文件
  2. 用文本方式打开
  3. 增加一行:127.0.0.1 www.domain.com
  4. 启动本地服务器
  5. 启动浏览器访问 http://www.domain.com/
其他

QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码的更多相关文章

  1. QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码(转)

    OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容. QQ登录OAuth2 ...

  2. 什么是“QQ登录OAuth2.0”

    1. 什么是“QQ登录OAuth2.0 OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他 ...

  3. PHP 接入(第三方登录)QQ 登录 OAuth2.0 过程中遇到的坑

    前言 绝大多数网站都集成了第三方登录,降低了注册门槛,增强了用户体验.最近看了看 QQ 互联上 QQ 登录的接口文档.接入 QQ 登录的一般流程是这样的:先申请开发者 -> 然后创建应用(拿到一 ...

  4. 腾讯微博OAuth2.0 .NET4.0 SDK 发布以及网站腾讯微博登陆示例代码(原创)

    1.使用简单方便,包含详细注释: 2.暂时只支持xml格式字符串的转换,建议接口使用xml参数:3.QweiboSDK.Controllers命名空间下已包含所有API接口:4.只需调用到Qweibo ...

  5. oauth2.0实现sso单点登录的方式和相关代码

    SSO介绍 什么是SSO 百科:SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他 ...

  6. OAuth2.0理解和用法

    现在网络的资料到处都是,很容易搜索到自己想要的答案.但答案通常只能解决自己一部分的问题.如果自己想要有一套自己的解决方案,还得重新撸一遍靠谱. 我需要学下OAuth2.0吗? 没看之前以为OAuth2 ...

  7. Oauth2.0 QQ&微信&微博实现第三方登陆

    一.写在前面 目前对于大多数的App或Web网站都支持有第三方登陆这个功能,用户可使用 QQ/ 微信/ 微博 帐号快速登录你的网站,降低注册门槛,为你的网站带来海量新用户.最近在新项目上刚好用到了,在 ...

  8. QQ登录整合/oauth2.0认证-02-跳转到QQ互联页

    ---------------------------目录---------------------------------- QQ登录整合/oauth2.0认证-01-申请appkey和appid ...

  9. 第三方登录:QQ登录实现(OAuth2.0)

    一.创建应用 1.在 QQ互联 创建应用 地址:https://connect.qq.com/manage.html#/ 然后进行实名认证,创建应用,审核通过 然后点击查看,可以获得 APP ID 和 ...

随机推荐

  1. c# sqlserver备份还原(转)

    WinForm c# 备份 还原 数据库 其实是个非常简单的问题,一个Form,一个Button,一个OpenFileDialog,一个SaveFileDialog.下面给出备份与还原类 using ...

  2. php 使用phpqrcode类生成带有logo的二维码 使logo不失真(透明)

    在开发中 发现phpqrcode类在加入logo时,如果 logo 是 png 图像带有透明区域时,二维码上都无法正常完美的显示出来 解决方法便是:修改phpqrcode文件中的 QRimage类下的 ...

  3. php 数组 类对象 值传递 引用传递 区别

    一般的数据类型(int, float, bool)不做这方面的解说了 这里详细介绍一下数组和的类的对象作为参数进行值传递的区别 数组值传递 实例代码: <?php function main() ...

  4. lua curl动态链接库编译安装(二)

    下面再介绍一下lua-curl中的lua-curl-0.2.tar.gz版本的安装方法,可能对于一般的人来说这个很简单,但是对于我们这些菜鸟来说就不一样了: # wget http://files.l ...

  5. android.os.NetworkOnMainThreadException 在4.0之后谷歌强制要求连接网络不能在主线程进行访问

    谷歌在4.0系统以后就禁止在主线程中进行网络访问了,原因是: 主线程是负责UI的响应,如果在主线程进行网络访问,超过5秒的话就会引发强制关闭, 所以这种耗时的操作不能放在主线程里.放在子线程里,而子线 ...

  6. LED驅動芯片最大特點

    最大特點是: 1.電源電壓在很寬的範圍內工作時,(約180V-265V)能保證 LED的恒功率輸出,並且 LED可實現無頻閃輸出. 2.實現安全隔離的安全電壓輸出,甚至是安全超低電壓輸出. 3.IC2 ...

  7. 新版的DEV RichEdit很强悍,兼容docx,排版更强

    RV至少rtf格式不用自己搞了 Rv没Dev出的强悍 RV最蛋疼的就是表格 DEV目前看来,表格比RV强其他方面来说,觉得到差不多,无所谓dev的excel我整过一次,BUG不少dxRichEdit换 ...

  8. [GDKOI2016]小学生数学题

    记 $F(n)=\sum\limits_{i=1}^{n}i^{-1}$ $G(n)=\sum\limits_{i=1,i\neq jp}^{n}i^{-1}$ 我们要算$F(n)\%p^k$ 那么 ...

  9. Delphi 多线程的操作

    Delphi 操作多线程的代码, 在项目中需要在webservice中使用多线程,程序思想如下: 1.就创建一个线程, 也就是说有两个线程,主线程和创建的线程, 主线程用于程序的别的操作,例如停止服务 ...

  10. Socket的协议地址属性

    首先列举所需要的头文件 #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #in ...