C#实现单点登录
- 格式:docx
- 大小:304.30 KB
- 文档页数:34
真正实现完全跨域单点登录
关键字:单点登录 跨域 跨域单点登录
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
跨域单点登录分为:
1、跨子域单点登录。如 和 这2个站点同属一个主域,实现跨子域单点登录很简单,可以利用cookie,设置Domain为"'即可,这里就不再赘叙。
2、完成跨域单点登录。如 这2个站点之间实现共享一个身份验证系统,只需在一处地方登录,下面主要谈下这种方式的实现方法。
跨域单点登录实现原理:
当用户第一次访问web应用系统1的时候,因为还没有登录,会被引导到认证中心进行登录;根据用户提供的登录信息,认证系统进行身份效验,如果通过效验,返回给用户一个认证的凭据;用户再访问别的web应用的时候就会将这个Token带上,作为自己认证的凭据,应用系统接受到请求之后会把Token送到认证中心进行效验,检查Token的合法性。如果通过效验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。所有应用系统共享一个身份认证系统。认证系统的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,认证系统应该生成统一的认证标志,返还给用户。另外,认证系统还应该对Token进行效验,判断其有效性。 所有应用系统能够识别和提取Token信息要实现SSO的功能,让用户只登录一次,就必须让应用系统能够识别已经登录过的用户。应用系统应该能对Token进行识别和提取,通过与认证系统的通讯,能自动判断当前用户是否登录过,从而完成单点登录的功能。
比如说,我现在有3个分站点和1个认证中心(总站)。当用户访问分站点的时候,分站点会发Token到验证中心进行验证。验证中心判断用户是否已经登录。如果未登录,则返回到验证中心登录入口进行登录,否之则返回Token验证到分站点,直接进入分站点。
如图所示:
上面是实现单点登录的原理图,下面介绍下如何用实现跨域单点登录:
一、新建网站 MasterSite,作为总站认证中心。配置web.config,采用form登录验证。
配置如下:
[xhtml] view plaincopy
1.
2.
3.
4.
5.
6.
7.
8.
添加Default.aspx页面,用来进行登录。代码如下:
HTML Code:
[c-sharp] view plaincopy
1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
2.
3.
4.
5.
6.
7. 总站登录
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Default.cs Code:
[c-sharp] view plaincopy
1. using System;
2. using System.Data;
3. using System.Configuration;
4. using System.Web;
5. using System.Web.Security;
6. using System.Web.UI;
7. using System.Web.UI.WebControls;
8. using System.Web.UI.WebControls.WebParts;
9. using System.Web.UI.HtmlControls;
10. using System.Text;
11.
12. public partial class _Default : System.Web.UI.Page 13. {
14. protected void Page_Load(object sender, EventArgs e)
15. {
16. if (!IsPostBack)
17. {
18. SSORequest ssoRequest = new SSORequest();
19.
20.
21. #region 验证 Post 过来的参数
22. //--------------------------------
23. // 请求注销
24. if (!string.IsNullOrEmpty(Request["Logout"]))
25. {
26. Authentication.Logout();
27. return;
28. }
29. //--------------------------------
30. // 各独立站点标识
31. if (string.IsNullOrEmpty(Request["IASID"]))
32. {
33. return;
34. }
35. else
36. {
37. ssoRequest.IASID = Request["IASID"];
38. }
39.
40. //--------------------------------
41. // 时间戳
42. if (string.IsNullOrEmpty(Request["TimeStamp"]))
43. {
44. return;
45. }
46. else
47. {
48. ssoRequest.TimeStamp = Request["TimeStamp"];
49. }
50.
51. //--------------------------------
52. // 各独立站点的访问地址
53. if (string.IsNullOrEmpty(Request["AppUrl"]))
54. {
55. return;
56. } 57. else
58. {
59. ssoRequest.AppUrl = Request["AppUrl"];
60. }
61.
62. //--------------------------------
63. // 各独立站点的 Token
64. if (string.IsNullOrEmpty(Request["Authenticator"]))
65. {
66. return;
67. }
68. else
69. {
70. ssoRequest.Authenticator = Request["Authenticator"];
71. }
72.
73. ViewState["SSORequest"] = ssoRequest;
74.
75. #endregion
76.
77.
78. //验证从分站发过来的Token
79. if (Authentication.ValidateAppToken(ssoRequest))
80. {
81. string userAccount = null;
82.
83. // 验证用户之前是否登录过
84. //验证 EAC 认证中心的 Cookie,验证通过时获取用户登录账号
85. if (Authentication.ValidateEACCookie(out userAccount))
86. {
87. erAccount = userAccount;
88.
89. //创建认证中心发往各分站的 Token
90. if (Authentication.CreateEACToken(ssoRequest))
91. {
92. Post(ssoRequest);
93. }
94. }
95. else
96. {
97. return;
98. }
99. }
100. else