使用Windows Live ID登录网站

http://tech.ddvip.com/2008-12/122829342597137_3.html

在上一篇文章之中,我具体的讲解了使用Google的Authsub接口来让自己的网站支持Google帐号登陆,今天要讲到的是WindowsLive ID,即使用MSN或Hotmail的帐号来登录网站,因为其中的基础原理类似,因此,假如对登录的流程和原理不清楚的话,建议去看看我前面的几篇文章,在这里,我主要讲解具体的实现和源码。

  关于WindowsLive ID接口的更多信息,建议去参考查看WindowsLive ID接口介绍网站的更多内容,我在这篇文章之中,仅仅会讲到WindowsLive ID在WebAuthentication上的一个应用。

  首先,和GoogleAuthSub一样,你必须先在Live的云计算开发中心AzureServices Developer Portal去注册你的程序,其实几个星期前我注册程序的时候应该还不叫这个比较时髦的名字的,今天我因为写这个文章再上去一看,居然变成“云”了,这么说来,我已经“云计算”了一把了,呵呵!

  现在的注册界面如图(我这里截图是修改界面,添加界面和这个类似):

  注册完成之后,就可以得到一个上面的ApplicationID,需要说明的是,上面的ReturnURL意义不是很大,可能仅仅在缺省的时候使用,因为我注册时候采用的图上显示的值,而实际上使用的却是http://account.step1.cn/account/Handler.aspx?ass=live.com,只要将这个值传递过去,Live ID服务应该就不使用注册的值了。

  注册完成之后,就可以开始进行开发,需要说明的是,在LiveID站点上提供了一个非常简单的类WindowsLiveLogin.cs,应该可以在这个例子之中得到这个类:Runningthe C# QuickStart Sample,而且可能是因为有了这个类,Microsoft觉得不需要再去提供什么和服务端交互的文档了(反正我没有找到),因此,我就直接不改动任何程序的情况下使用了这个类,这样,一切就方便了很多了。

先看如何得到用来让用户登录的转向地址,这个太容易了,因为这正是WindowsLiveLogin类的方法,需要说明的是,WindowsLiveLogin类有几个方法来获得转向地址的,其中GetLoginUrl方法得到的地址仅仅进行用户登录,而不向用户申请任何权限,而GetConsentUrl(stringscope)方法可以指定向用户申请读取相应数据的权限,和GoogleAuthSub一样,我们在使用Live的登录的时候也需要读取用户的地址本信息来获得用户的登录帐号地址,因此,我们使用wll.GetConsentUrl("Contacts.View");方法来获得转向URL,("Contacts.View"代表对地址本的只读访问),当然在使用这个方法之前,要先设置好PolicyUrl属性(隐私申明地址)和ReturnUrl属性(登录完成之后的回转地址);

  有一点需要特别说明的是:在使用GetLoginUrl或者GetConsentUrl方法之前,Live要求用户必须必须已经指定WindowsLiveLogin的PolicyUrl属性,也就是隐私申明的地址,而且,要求指定的网址必须是能够访问的,似乎Live还会去检查这个网址是否能够访问的,我在系统之中将隐私申明的网址指定为我的登录页面,因为在那个页面有我关于保护用户隐私的申明。

  将用户转向到刚才获取的URL之后,用户就会被转向到Live ID的登录页:

  用户输入自己的帐号登录之后,就会出现用户的授权提示信息,可惜因为我的测试帐号早就授权过了,所以,这个页面被直接跳过,我不能在这里给出截图,实在抱歉,在用户在授权信息页面上点击同意之后,Live就会转向到上面通过ReturnUrl指定的登录回转地址。

Live转回到登录回转地址的时候,会有多种参数(delauth,login,logout,clearcookie),根据Live接口的要求,这些类型都应该实现,具体每个类型代表如下含义:

  1.delauth,这个是我主要用到的类型,就是在用户登录并授与访问权限之后,回转的类型,注意,必须调用GetConsentUrl方法才会得到这种回转,从参数之中可以获取到ConsentToken参数,就是后面要用到的数据访问令牌。

  2.login,这是调用GetLoginUrl方法之后回转的类型,也就是说,是不需要访问用户的任何数据的情况下回转访问的参数类型;

  3.logout,注销

  4.clearcookie,清除Cookie

  在本系统之中,仅仅使用了delauth,从参数之中获得ConsentToken参数,然后,我们可以使用这个数据令牌去获取用户的帐户名称和昵称,同样,也是访问Windows Live Contacts接口,因为Windows Live Contacts接口不是我要讲的主题,因此不做详细的介绍,需要了解我如何使用,参考我的代码即可。

  取得用户的登录ID和昵称之后,写入到用户的Cookie之中,然后登录回转,采用Live登录的过程就算完成了,还有什么不清楚的地方的话,请参考我下面贴出的整体代码:

  LiveServer.cs代码

 1  public class LiveServer : BaseServer
 2  {
 3    public WindowsLiveLogin wll;
 4    //采用Web.Config之中的XML节点作为构造函数参数
 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    //处理登录回转信息
64    public overridevoid parseHandle(HttpContext page)
65    {
66      string action =page.Request["action"];
67      switch (action)
68      {
69        case"delauth":
70          //获得用户地址本XML数据
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          //设置用户信息到Cookie
79          AccountHelper.setUserInfo(account,name, this.name);
80          //回转
81          AccountHelper.returnOpener();
82          page.Response.End();
83          break;
84        case"login"://这是Live接口要求定义支持的类型,系统之中没有主动使用这种请求
85          WindowsLiveLogin.Useruser = wll.ProcessLogin(page.Request.Form);//从URL参数之中解析出用户的登录信息
86          AccountHelper.setUserInfo(user.Id,user.Id, this.name);//这里的user.ID实际上已经是用户的E-mail
87          AccountHelper.redirect(wll.GetConsentUrl("Contacts.View",user.Token));
88          page.Response.End();
89          break;
90        case"logout"://这是Live接口要求定义支持的类型,系统之中没有主动使用这种请求
91          AccountHelper.clearCookie();
92          AccountHelper.returnOpener();
93          page.Response.End();
94          break;
95        case"clearcookie"://这是Live接口要求定义支持的类型,系统之中没有主动使用这种请求
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 =============

使用Windows Live ID登录网站相关推荐

  1. ndows live id怎么登陆,手机如何注册和使用Windows Live ID帐号

    首先您可以在百度搜索Windows Live账号注册即可找到入口开始注册了. Windows Live 与 Windows Phone Windows Phone是最新一代的从设计开始即与Window ...

  2. .NET C#使用微信公众号登录网站

    这篇文章主要介绍了.NET C#使用微信公众号登录网站,教大家利用微信公众号进行网站登录,感兴趣的小伙伴们可以参考一下 适用于:本文适用于有一定微信开发基础的用户 引言:花了300大洋申请了微信公众平 ...

  3. python登录网站后爬取数据_需要登陆网站后才能获取数据的页面爬取

    本文转载自以下链接:https://www.makcyun.top/web_scraping_withpython8.html 目的是万一博主网站无法访问到的话自己需要学习的东西可就不存在了. 本文需 ...

  4. 【CURL】模拟登录网站并获取用户信息

    模拟登录网站并获取用户信息 前言 这次来做的是通过代码的方式,模拟登录秒拍官网,获取登录用户的信息. 前后端分离 本文的标题是CURL,传统的网站是PHP代码直接渲染项目视图,通过表单提交到控制器直接 ...

  5. 通用权限管理系统组件 中集成多个子系统的单点登录(网站入口方式)附源码

    通用权限管理系统组件 (GPM - General Permissions Manager) 中集成多个子系统的单点登录(网站入口方式)附源码 上文中实现了直接连接数据库的方式,通过配置文件,自定义的 ...

  6. Winform模拟post请求和get请求登录网站

    引言 最近有朋友问如何用winform模拟post请求,然后登录网站,稍微想了一下,大致就是对http报文的相关信息的封装,然后请求网站登录地址的样子.发现自己的博客中对这部分只是也没总结,就借着这股 ...

  7. 按键 使用WinHttp实现POST方式用户模拟登录网站

    引言 这篇文章是我以前在一个论坛里写的,今天把这篇文章转移到这里. 文章主要介绍了如何模拟一个网站的登录. 这里使用的辅助工具是按键精灵,编程语言类似于VB. 实现步骤 第一步,获取登录地址 打开登录 ...

  8. python脚本根据cookies自动登录网站_python实现带验证码网站的自动登陆实现代码...

    早听说用python做网络爬虫非常方便,正好这几天单位也有这样的需求,需要登陆XX网站下载部分文档,于是自己亲身试验了一番,效果还不错. 本例所登录的某网站需要提供用户名,密码和验证码,在此使用了py ...

  9. HttpWebRequest自动登录网站并获取网站内容(不包含验证码的网站)

    HttpWebRequest自动登录网站并获取网站内容(不包含验证码的网站) 可以使用 Visual Sniffer(百度搜索) 来捕捉提交的数据信息: 1. 访问你需要站外提交的页面,比如 CSDN ...

  10. 间隔一段时间重复自动登录网站、定时自动登录网站的软件 —— 定时执行专家,无需复杂编程,简单配置即可使用

    常常有网友在网上发帖求助,想找一个定时自动登录网页(网站)的软件,大致需求如下: 1.打开网页 → 2.填写用户名.密码 → 3.点击登录按钮 → 4.登录成功 另外,还有诸如:要求间隔是每3个小时自 ...

最新文章

  1. 用InstallShield 打包工具 打 Win32 程序 (depends.exe 用看程序都依赖了哪些dll)
  2. 网络与服务器编程框架库 acl_3.0.12 发布
  3. java——File类常用方法
  4. 生产环境常见的HTTP状态码列表
  5. 关于WPF中TextBox使用SelectAll无效的问题的解决办法
  6. 对其他组所提建议的回复(第一阶段)
  7. SSM:Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束的解决
  8. 复工后,汉堡薯条、奶茶“续命”又开始了
  9. java hibernate unable to read xml_各位大神,这是什么错误啊
  10. Runtime.getRuntime().exec()----记录日志案例
  11. 呼之欲出的“7万亿”往哪儿去?
  12. JavaScript 计算标准体重的公式
  13. 小数转化为百分数(保留小数点后一位有效数字)
  14. 0基础学绘画怎么临摹
  15. taskset 查询或设置进程绑定CPU(亲和性)
  16. Unity 自发光(燃烧)溶解Shader
  17. 【Excel】Excel学习笔记 -- 通配符的使用与定位条件
  18. 计算梯度的三种方法: 数值法,解析法,反向传播法
  19. IT计算机前后端相关专业——20个常用的学习教程及在线编程工具
  20. iot-Scada免费Scada组态软件系列教程4-二次开发与版本部署

热门文章

  1. 第五届强网杯全国网络安全挑战赛writeup
  2. 2021年茶艺师(中级)考试题库及茶艺师(中级)报名考试
  3. mysql基于PHP下的大学生校园交流论坛的设计与实现 毕业设计源码101634
  4. 案例征集 | 2021中国数据资产管理工具市场研究报告
  5. uboot 中内存测试,内存检测方法
  6. (转)TTime, TDateTime
  7. 济南技工学校计算机,济南华力科技技工学校
  8. 快速掌握阿里云 OSS
  9. 五十二度系统维护光盘-驱动篇 1.16.2008
  10. java获取本月最后一天