使用Windows Live ID登录网站
使用Windows Live ID登錄網(wǎng)站
http://tech.ddvip.com/2008-12/122829342597137_3.html
在上一篇文章之中,我具體的講解了使用Google的Authsub接口來讓自己的網(wǎng)站支持Google帳號登陸,今天要講到的是WindowsLive ID,即使用MSN或Hotmail的帳號來登錄網(wǎng)站,因?yàn)槠渲械幕A(chǔ)原理類似,因此,假如對登錄的流程和原理不清楚的話,建議去看看我前面的幾篇文章,在這里,我主要講解具體的實(shí)現(xiàn)和源碼。
關(guān)于WindowsLive ID接口的更多信息,建議去參考查看WindowsLive ID接口介紹網(wǎng)站的更多內(nèi)容,我在這篇文章之中,僅僅會講到WindowsLive ID在WebAuthentication上的一個(gè)應(yīng)用。
首先,和GoogleAuthSub一樣,你必須先在Live的云計(jì)算開發(fā)中心AzureServices Developer Portal去注冊你的程序,其實(shí)幾個(gè)星期前我注冊程序的時(shí)候應(yīng)該還不叫這個(gè)比較時(shí)髦的名字的,今天我因?yàn)閷戇@個(gè)文章再上去一看,居然變成“云”了,這么說來,我已經(jīng)“云計(jì)算”了一把了,呵呵!
現(xiàn)在的注冊界面如圖(我這里截圖是修改界面,添加界面和這個(gè)類似):
注冊完成之后,就可以得到一個(gè)上面的ApplicationID,需要說明的是,上面的ReturnURL意義不是很大,可能僅僅在缺省的時(shí)候使用,因?yàn)槲易詴r(shí)候采用的圖上顯示的值,而實(shí)際上使用的卻是http://account.step1.cn/account/Handler.aspx?ass=live.com,只要將這個(gè)值傳遞過去,Live ID服務(wù)應(yīng)該就不使用注冊的值了。
注冊完成之后,就可以開始進(jìn)行開發(fā),需要說明的是,在LiveID站點(diǎn)上提供了一個(gè)非常簡單的類WindowsLiveLogin.cs,應(yīng)該可以在這個(gè)例子之中得到這個(gè)類:Runningthe C# QuickStart Sample,而且可能是因?yàn)橛辛诉@個(gè)類,Microsoft覺得不需要再去提供什么和服務(wù)端交互的文檔了(反正我沒有找到),因此,我就直接不改動任何程序的情況下使用了這個(gè)類,這樣,一切就方便了很多了。
先看如何得到用來讓用戶登錄的轉(zhuǎn)向地址,這個(gè)太容易了,因?yàn)檫@正是WindowsLiveLogin類的方法,需要說明的是,WindowsLiveLogin類有幾個(gè)方法來獲得轉(zhuǎn)向地址的,其中GetLoginUrl方法得到的地址僅僅進(jìn)行用戶登錄,而不向用戶申請任何權(quán)限,而GetConsentUrl(stringscope)方法可以指定向用戶申請讀取相應(yīng)數(shù)據(jù)的權(quán)限,和GoogleAuthSub一樣,我們在使用Live的登錄的時(shí)候也需要讀取用戶的地址本信息來獲得用戶的登錄帳號地址,因此,我們使用wll.GetConsentUrl("Contacts.View");方法來獲得轉(zhuǎn)向URL,("Contacts.View"代表對地址本的只讀訪問),當(dāng)然在使用這個(gè)方法之前,要先設(shè)置好PolicyUrl屬性(隱私申明地址)和ReturnUrl屬性(登錄完成之后的回轉(zhuǎn)地址);
有一點(diǎn)需要特別說明的是:在使用GetLoginUrl或者GetConsentUrl方法之前,Live要求用戶必須必須已經(jīng)指定WindowsLiveLogin的PolicyUrl屬性,也就是隱私申明的地址,而且,要求指定的網(wǎng)址必須是能夠訪問的,似乎Live還會去檢查這個(gè)網(wǎng)址是否能夠訪問的,我在系統(tǒng)之中將隱私申明的網(wǎng)址指定為我的登錄頁面,因?yàn)樵谀莻€(gè)頁面有我關(guān)于保護(hù)用戶隱私的申明。
將用戶轉(zhuǎn)向到剛才獲取的URL之后,用戶就會被轉(zhuǎn)向到Live ID的登錄頁:
用戶輸入自己的帳號登錄之后,就會出現(xiàn)用戶的授權(quán)提示信息,可惜因?yàn)槲业臏y試帳號早就授權(quán)過了,所以,這個(gè)頁面被直接跳過,我不能在這里給出截圖,實(shí)在抱歉,在用戶在授權(quán)信息頁面上點(diǎn)擊同意之后,Live就會轉(zhuǎn)向到上面通過ReturnUrl指定的登錄回轉(zhuǎn)地址。
Live轉(zhuǎn)回到登錄回轉(zhuǎn)地址的時(shí)候,會有多種參數(shù)(delauth,login,logout,clearcookie),根據(jù)Live接口的要求,這些類型都應(yīng)該實(shí)現(xiàn),具體每個(gè)類型代表如下含義:
1.delauth,這個(gè)是我主要用到的類型,就是在用戶登錄并授與訪問權(quán)限之后,回轉(zhuǎn)的類型,注意,必須調(diào)用GetConsentUrl方法才會得到這種回轉(zhuǎn),從參數(shù)之中可以獲取到ConsentToken參數(shù),就是后面要用到的數(shù)據(jù)訪問令牌。
2.login,這是調(diào)用GetLoginUrl方法之后回轉(zhuǎn)的類型,也就是說,是不需要訪問用戶的任何數(shù)據(jù)的情況下回轉(zhuǎn)訪問的參數(shù)類型;
3.logout,注銷
4.clearcookie,清除Cookie
在本系統(tǒng)之中,僅僅使用了delauth,從參數(shù)之中獲得ConsentToken參數(shù),然后,我們可以使用這個(gè)數(shù)據(jù)令牌去獲取用戶的帳戶名稱和昵稱,同樣,也是訪問Windows Live Contacts接口,因?yàn)閃indows Live Contacts接口不是我要講的主題,因此不做詳細(xì)的介紹,需要了解我如何使用,參考我的代碼即可。
取得用戶的登錄ID和昵稱之后,寫入到用戶的Cookie之中,然后登錄回轉(zhuǎn),采用Live登錄的過程就算完成了,還有什么不清楚的地方的話,請參考我下面貼出的整體代碼:
LiveServer.cs代碼
1 public class LiveServer : BaseServer
2 {
3 public WindowsLiveLogin wll;
4 //采用Web.Config之中的XML節(jié)點(diǎn)作為構(gòu)造函數(shù)參數(shù)
5 public LiveServer(System.Xml.XmlNode node):base(node)
6 {
7 wll = new WindowsLiveLogin(false);
8 for (int i = 0; i < node.Attributes.Count; i++)
9 {
10 switch(node.Attributes[i].LocalName)
11 {
12 case"appid":
13 wll.AppId =node.Attributes[i].Value;
14 break;
15 case"secret":
16 wll.Secret = node.Attributes[i].Value;
17 break;
18 case"securityalgorithm":
19 wll.SecurityAlgorithm= node.Attributes[i].Value;
20 break;
21 }
22 }
23 }
24 //采用回傳得到的令牌獲取用戶的信息
25 public XmlDocumentgetData(string token)
26 {
27 string lid =wll.ProcessConsentToken(token).LocationID;
28 //訪問用戶的地址本
29 HttpWebRequestrequest = (HttpWebRequest)WebRequest.Create(new Uri("https://livecontacts.services.live.com/users/@L@"+ lid + "/rest/LiveContacts/owner"));
30 request.Method ="GET";
31 request.Headers.Add("Authorization","DelegatedToken dt="" +wll.ProcessConsentToken(token).DelegationToken + """);
32 HttpWebResponseresponse = getResponse(request);
33 XmlDocument doc =new XmlDocument();
34 if (response !=null)
35 {
36 doc.Load(response.GetResponseStream());
37 }
38 return doc;
39 }
40 public staticHttpWebResponse getResponse(HttpWebRequest request)
41 {
42 try
43 {
44 return(HttpWebResponse)request.GetResponse();
45 }
46 catch (WebExceptione)
47 {
48 HttpContext.Current.Response.Write(e.Message);
49 string result = newStreamReader(e.Response.GetResponseStream()).ReadToEnd();
50 HttpContext.Current.Response.Write(result);
51 HttpContext.Current.Response.End();
52 }
53 return null;
54 }
55 //得到用戶的登錄URL地址
56 public overridestring getLoginUrl()
57 {
58 wll.PolicyUrl =AccountHelper.getLoginUrl();
59 wll.ReturnUrl =getHandleUrl();
60 returnwll.GetConsentUrl("Contacts.View");
61 //returnwll.GetLoginUrl();
62 }
63 //處理登錄回轉(zhuǎn)信息
64 public overridevoid parseHandle(HttpContext page)
65 {
66 string action =page.Request["action"];
67 switch (action)
68 {
69 case"delauth":
70 //獲得用戶地址本XML數(shù)據(jù)
71 XmlDocument doc =getData(page.Request["ConsentToken"]);
72 //獲取用戶帳號
73 XmlNode node =doc.SelectSingleNode("Owner/WindowsLiveID");
74 string account =node != null ? node.InnerText : "";
75 //獲取用戶的昵稱
76 node =doc.SelectSingleNode("Owner/Profiles/Personal/DisplayName");
77 string name = node!= null ? node.InnerText : "";
78 //設(shè)置用戶信息到Cookie
79 AccountHelper.setUserInfo(account,name, this.name);
80 //回轉(zhuǎn)
81 AccountHelper.returnOpener();
82 page.Response.End();
83 break;
84 case"login"://這是Live接口要求定義支持的類型,系統(tǒng)之中沒有主動使用這種請求
85 WindowsLiveLogin.Useruser = wll.ProcessLogin(page.Request.Form);//從URL參數(shù)之中解析出用戶的登錄信息
86 AccountHelper.setUserInfo(user.Id,user.Id, this.name);//這里的user.ID實(shí)際上已經(jīng)是用戶的E-mail
87 AccountHelper.redirect(wll.GetConsentUrl("Contacts.View",user.Token));
88 page.Response.End();
89 break;
90 case"logout"://這是Live接口要求定義支持的類型,系統(tǒng)之中沒有主動使用這種請求
91 AccountHelper.clearCookie();
92 AccountHelper.returnOpener();
93 page.Response.End();
94 break;
95 case"clearcookie"://這是Live接口要求定義支持的類型,系統(tǒng)之中沒有主動使用這種請求
96 default:
97 AccountHelper.clearCookie();
98 string type;
99 byte[] content;
100 wll.GetClearCookieResponse(outtype, out content);
101 page.Response.ContentType= type;
102 page.Response.OutputStream.Write(content,0, content.Length);
103 page.Response.End();
104 break;
105
106 }
107 }
108 }
上一頁123
===================End =============
總結(jié)
以上是生活随笔為你收集整理的使用Windows Live ID登录网站的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 佛山科学技术学院计算机期末试题,佛山科学
- 下一篇: 统计员工信息c语言设计,工资信息管理系统