日期:2014-05-17  浏览次数:20917 次

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


2、如果你对腾讯的那一套协议很熟悉的话,你可以自己去写中间的认证过程,如果不熟悉,就可以用大牛们写的程序来。我这边用的是QzoneSDK,是园子里的大牛写的,具体参考地址:http://qqconnect.codeplex.com/
3、以上两步完成之后,在你的config文件中appsetting节点添加以下三个配置项
<add key="QzoneCustomerKey" value="11111" />
<add key="QzoneConsumerSecret" value="1111111" />
<add key="QzoneCallbackUrl" value="/site/qzonecallback"/>
QzoneCustomerKey对应app id,QzoneConsumerSecret 对应app key ,QzoneCallbackUrl是用qq登录之后,腾讯那边回调你完整的路径。
4、因为我将controller单独作为一个项目,所以将QzoneSDK.dll添加到这个项目
在页面上放置按钮,打开qq登录的页面,然后登录成功之后回调您的网站的页面。此时如果用户在你的网站有账号,那就可以绑定现有账号,或者新注册一个账号。如果你是新建站,也可以完全使用qq登录来作为用户体系。
下面上代码:






public ActionResult QzoneLogin ( ) {


string key = ConfigurationManager.AppSettings["QzoneCustomerKey"];


string secret = ConfigurationManager.AppSettings["QzoneConsumerSecret"];


var context = new QzoneSDK.Context.QzoneContext(key, secret);


var callbackUrl = ConfigurationManager.AppSettings["QzoneCallbackUrl"];


var requestToken = context.GetRequestToken(callbackUrl);


var authenticationUrl = context.GetAuthorizationUrl(requestToken, callbackUrl);


HttpContext.Session["qzonetokenkey"] = requestToken.TokenKey;


HttpContext.Session["qzonetokensecret"] = requestToken.TokenSecret;


return new RedirectResult(authenticationUrl);


}


//回调页面


public void QzoneCallback ( ) {


if (Request.QueryString["oauth_vericode"] != null) {


var requestTokenKey = HttpContext.Session["qzonetokenkey"].ToString();


var requestTokenSecret = HttpContext.Session["qzonetokensecret"].ToString();


var verifier = Request.QueryString["oauth_vericode"];


string key = ConfigurationManager.AppSettings["QzoneCustomerKey"];


string secret = ConfigurationManager.AppSettings["QzoneConsumerSecret"];


QzoneSDK.Qzone qzone = new QzoneSDK.Qzone(key, secret, requestTokenKey, requestTokenSecret, verifier);


QzoneSDK.Qzone qzone2 = new QzoneSDK.Qzone(key, secret, qzone.OAuthTokenKey, qzone.OAuthTokenSecret, string.Empty, true, qzone.OpenID);


Session["qzoneauthcallback"] = qzone2;


var currentUser = qzone2.GetCurrentUser();


var user = (BasicProfile)JsonConvert.Import(typeof(BasicProfile), currentUser);


if (null != user) {


QQAuthEntity qqauth = BLLFactory<QQAuthService>.Instance.GetQQAuthEntityByOpenID(qzone2.OpenID);


if (qqauth != null) {


AccountState state = UserContext.Instance.QzoneAuthLogin(qzone2.OpenID, Utils.GetRealIP());


if (state == AccountState.Normal) {


Response.Write("<script>opener.location.href=\"/\";window.close();</script>");


} else {


Response.Write("<script>opener.location.href =\"/site/login\";window.close();</script>");


}


} else {


Response.Write("<script>opener.location.href =\"/site/binduser\";window.close();</script>");


}


}


}


}
  QQAuthEntity的结构,openid,accesstokenkey,accesstokensecret是腾讯返回的,根本没有qq号,所以很多人误以为会获取到qq号。


public class QQAuthEntity {


public int ID { get; set; }


public int UserID { get; set; }


public string OpenID { get; set; }


public string AccessTokenKey { get; set; }