这几天帮公司搞快捷登陆,找了很多资料其中旺旺和msn的资料较少,先分享一下,方便以后朋友遇到此类似问题,蛋碎一地
首先分享的是qq登陆,这个官方给的资料很全面,而也有针对asp.net的api所以不用死太多脑细胞
html页面
<asp:LinkButton ID="LinkButtonQQ" runat="server" BorderStyle="None" CssClass="b_r"
OnClick="LinkButtonQQ_Click"><img src="/images/other_account_pic1.gif" alt="QQ" />QQ</asp:LinkButton>
这个不用解释,一个qq的图标按钮控件
需要从官网上下载asp.net的api
在web.config文件中加入如下代码
<configSections>
<sectionGroup name="QQSectionGroup">
<section name="QzoneSection" type="System.Configuration.NameValueSectionHandler,System, Version=4.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089" />
</sectionGroup>
<section name="rewriter" requirePermission="false" type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter"/>
</configSections>
<QQSectionGroup>
<QzoneSection>
<add key="AppKey" value=申请应用分配给的key/>
<add key="AppSecret" value=申请应用分配给的AppSecret />
<add key="CallBackURI" value=回调地址 />
<add key="AuthorizeURL" value="https://graph.qq.com/oauth2.0/authorize" />
</QzoneSection>
</QQSectionGroup>
引用对应的命名空间
using QConnectSDK;
using QConnectSDK.Context;
var context = new QzoneContext();
string state = Guid.NewGuid().ToString().Replace("-", "");
//此处代码略过,目的是把state保存在session方便日后使用
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);
Response.Redirect(authenticationUrl);
在接受页面代码如上,一般来说要是实现第三方登陆我们只需要把qq上唯一的id和自己网站上的某一用户名绑定或者重新定义用户名并绑定qq的唯一id
在接受页面上依然要引用命名空间
using QConnectSDK;
QOpenClient qzone = null;
QConnectSDK.Models.User currentUser = null;
string verifier = Request.Params["code"];//页面回传的code
//查找数据库若有则直接登陆若无则绑定页面
string state =从前面保存的session中取出值并赋值
qzone = new QOpenClient(verifier, state);
currentUser = qzone.GetCurrentUser();
string userOpenId = qzone.OAuthToken.OpenId;//该openid为该qq号唯一对应id
旺旺登陆 (本人使用Top方法)
在前台页面中跳入该地址
http://container.api.taobao.com/container?appkey=用户申请应用分配的key&encode=utf-8&redirect_uri=定义的回调地址
在接受页面中
先应用命名空间
using Top.Api;
using Top.Api.Response;
using Top.Api.Request;
using Top.Api.Util;
此处需要下载topsdk.dll引用在项目中
string top_session = Request.Params["top_session"];
string url1 = "正式环境调用地址
string appkey = 分配到的key;
string appsecret =分配到的secret;
ITopClient client = new DefaultTopClient(url1, appkey, appsecret);
UserBuyerGetRequest req = new UserBuyerGetRequest();
req.Fields = "nick,sex";
UserBuyerGetResponse response = client.Execute(req, top_session);
string userWangWId = response.User.Nick.ToString();//此处获取的是旺旺的用户名
由于旺旺用户名是不能重复的,所以这个可以做为唯一识别用户方法,若需要其他功能则调用其他方法
MSN登陆
在前台页面中跳入该地址
https://oauth.live.com/authorize?client_id=用户分配的id&scope=需要什么信息就填写什么内容&response_type=code&redirect_uri=回调地址接受页面
string clientId = 分配的clientId;
string redirect_uri = 设定的回调地址;
string clientSecret = 分配的Secret;
string code = Request.Params["code"];
string oauthUrl = "https://oauth.live.com/token";
string postData = string.Format("client_id={0}&redirect_uri={1}&client_secret={2}&code={3}&grant_type=authorization_code",
HttpUtility.UrlEncode(clientId),
HttpUtility.UrlEncode(redirect_uri),
HttpUtility.UrlEncode(clientSecret),
HttpUtility.UrlEncode(code));
try
{
string tokenJson = RequestLiveToken(oauthUrl, postData);
RestJson tokenjson = new RestJson();
JavaScriptSerializer jsserialize = new JavaScriptSerializer();
tokenjson = jsserialize.Deserialize<RestJson>(tokenJson);//通过返回过来的string转成json数组并取出其中的access_token信息用于后面获取用户资料使用
string restUrl = "https://apis.live.net/v5.0/me?access_token=" + tokenjson.access_token;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(restUrl);
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string restJson = new StreamReader(response.GetResponseStream()).ReadToEnd();
MsnUserInfo userInfojson = new MsnUserInfo();
userInfojson = jsserialize.Deserialize<MsnUserInfo>(restJson);
string userMsnId = userInfojson.id;//此处获取的是msn对应的唯一id
}
catch (Exception ex)
{
显示错误信息或者跳回首页地址
}
因为msn需要两次授权所以需要使用try,catch来以免发生异常
其中需要调用到的post方法并返回参数
private static string RequestLiveToken(string uri, string postData)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
request.Method = "POST";
byte[] postBytes = Encoding.UTF8.GetBytes(postData);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postBytes.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(postBytes, 0, postBytes.Length);
requestStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string test = new StreamReader(response.GetResponseStream()).ReadToEnd();
return test;
}
为了方便转换成json数组,我这里定义了两个对象方便调用
[Serializable, StoreName("RestJson")]
public class RestJson
{
public string access_token { set; get; }
public string expires_in { set; get; }
public string refresh_token { set; get; }
public string scope { set; get; }
public string token_type { set; get; }
}
[Serializable, StoreName("MsnUserInfo")]
public class MsnUserInfo
{
[StoreNoSave]
public string id { set; get; }
public string name { set; get; }
public string first_name { set; get; }
public string last_name { set; get; }
public string link { set; get; }
}
为何要定义这些变量,是根据传回的json数组来决定
msn登陆我选择用REST方式而不是用本生提供的JS来获取用户信息
可参考使用