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