单点登陆NET的简单实现Word文档下载推荐.docx
- 文档编号:18582968
- 上传时间:2022-12-28
- 格式:DOCX
- 页数:11
- 大小:19.70KB
单点登陆NET的简单实现Word文档下载推荐.docx
《单点登陆NET的简单实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单点登陆NET的简单实现Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
WebSite"
8002"
</appsettings>
在Project类里进行引用。
using
System;
System.Configuration;
namespace
Amethysture.SSO.Shop
{
public
class
Project
public
static
string
Service
=
ConfigurationSettings.AppSettings["
];
WebSite
}
2、Shop的Global.cs
Shop的Global.cs定义了四个Session变量,UserID用来标识用户身份。
Pass标识用户即时状态,Security用于保存往来Service和Shop的通讯不是被仿冒的。
Url保存了上次请求的页面,以保证在用户登录后能转到用户请求的页面。
protected
void
Session_Start(Object
sender,
EventArgs
e)
this.Session.Add("
UserID"
0);
this.Session.Add("
Pass"
false);
Security"
"
);
Url"
3、Shop的Any.cs
Shop的Any.cs并没有包含代码,因为Any类从Page继承而来,为了代码分析方便,我们将代码集中到Page.cs中。
System.Web;
public
Any
:
Amethysture.SSO.Shop.Page
{
}
4、Shop的Page.cs
Page类有两个方法,CustomerValidate和Initialize。
CustomerValidate用户检查用户的即时状态,而Initialize是页面登录后发送给用户的信息。
我们的重点是CustomerValidate。
CustomerValidate是一个非常简单的流程,用条件语句检查Pass的状态,如果Pass为否,则表示用户没有登录,页面跳转到Service的Validate页面中。
我们要分析的是其中保存的Url和递交的WebSite和Security几个参数。
Url的作用在前面已经讲清楚了,只是为了保证用户登录后能回到原来的页面。
而WebSite是为了保证该站点是被Service所接受的,并且保证Service知道是哪个站点请求了用户即时状态。
因为这个例子是个简单的例子,在后面的Validate里没有验证WebSite是否是接受的请求站点,但是在实际应用中应该验证这一点,因为Shop和Service等同于服务器和客户端,服务器出于安全考虑必须要检查客户端是否是被允许的。
Security是非常重要的一点。
Shop对Service发送的是请求,不需要保证该请求没有被篡改,但是在Service应答Shop请求时就必须要保证应答的数据没有被篡改了。
Security正是为了保证数据安全而设计的。
在代码中,Security是通过Hash一个随机产生的数字生成的。
具有不确定性。
和保密性。
我们可以看到,Security同时保存在Session中和发送给Service。
我们把这个Security当作明文。
在后面我们可以看到,Security在Service经过再一次Hash后作为密文发送回Shop。
如果我们将Session保存的Security经过同样的Hash方法处理后等到的字符串如果和Service返回的密文相同,我们就能够在一定程度上保证Service应答的数据是没有经过修改的。
1.using
2.using
3.using
System.Security.Cryptography;
4.using
System.Text;
5.
6.namespace
7.{
8. public
Page
System.Web.UI.Page
9. {
10. private
CustomerValidate()
11. {
12. bool
Pass
(bool)
this.Session["
13. if
(!
Pass)
14. {
15. string
Security
;
16. Random
Seed
new
Random();
17. Security
Seed.Next(1,
int.MaxValue).ToString();
18. byte[]
Value;
19. UnicodeEncoding
Code
UnicodeEncoding();
20. byte[]
Message
Code.GetBytes(Security);
21. SHA512Managed
Arithmetic
SHA512Managed();
22. Value
Arithmetic.ComputeHash(Message);
23. Security
24. foreach(byte
o
in
Value)
25. {
26. Security
+=
(int)
+
O"
27. }
28. this.Session["
]
Security;
29. this.Session["
this.Request.RawUrl;
30. this.Response.Redirect(Project.Service
/Validate.aspx?
WebSite="
Project.WebSite
&
Security="
Security);
31. }
32. }
33.
34. protected
virtual
Initialize()
35. {
36. this.Response.Write("
<html>"
37. this.Response.Write("
<head>"
38. this.Response.Write("
<title>Amethysture
SSO
Project</title>"
39. this.Response.Write("
<link
rel=stylesheet
type=\"
text/css\"
href=\"
project.website
/Default.css\"
>"
40. this.Response.Write("
</head>"
41. this.Response.Write("
<body>"
42. this.Response.Write("
<iframe
width=\"
0\"
height=\"
0\"
src=\"
project.service
/Customer.aspx\"
></iframe>"
43. this.Response.Write("
<div
align=\"
center\"
44. this.Response.Write("
Amethysture
Shop
Page"
45. this.Response.Write("
</div>"
46. this.Response.Write("
</body>"
47. this.Response.Write("
</html>"
48. }
49.
50. protected
override
OnInit(EventArgs
51. {
52. base.OnInit(e);
53. this.CustomerValidate();
54. this.Initialize();
55. this.Response.End();
56. }
57. }
58.}
5、Service的Global.cs
现在我们页面转到了Service的Validate页面,我们转过来看Service的代码。
在Global中我们同样定义了四个Session变量,都和Shop的Session用处类似。
WebSite是保存请求用户即时状态的站点信息。
以便能在登录后返回正确的请求站点。
1.protected
2.{
3. this.Session.Add("
4. this.Session.Add("
5. this.Session.Add("
6. this.Session.Add("
7.}
6、Service的Validate.cs
首先,将Shop传递过来的参数保存到Session中。
如果用户没有登录,则转到Customer页面进行登录。
如果用户已经登录了。
则将用户即时状态传回给Shop站点。
如上所述,这里将Security重新Hash了一次传回给Shop,以保证数据不被纂改。
1.private
3. bool
4. if
((this.Request.QueryString["
!
null)
(this.Request.QueryString["
))
5. {
6. this.Session["
this.Request.QueryString["
7. }
8. if
9. {
10. this.Session["
11. }
12. if
(Pass)
13. {
14. string
UserID
].ToString();
15. string
16. string
17. byte[]
18. UnicodeEncoding
19. byte[]
20. SHA512Managed
21. Value
22. Security
23. foreach(byte
24. {
25. Security
26. }
27. this.Response.Redirect(WebSite
/Synchronous.aspx?
UserID="
Pass=True&
28. }
29. else
30. {
31. this.Response.Redirect("
Customer.aspx"
32. }
33.}
7、Service的Customer.cs和Login.cs
Customer主要的是一个用于登录的表单,这里就不贴出代码了。
这里分析一下Login的一段代码,这段代码是当登录是直接在Service完成的(WebSite为空值),则页面不会转到Shop或Office站点。
所以应该暂停在Service站点。
系统如果比较完美,这里应该显示一组字系统的转向链接。
下面我们看到,当Pass为真时,页面转回到Validate页面,通过上面的分析,我们知道,页面会转向Shop的Synchronous页面,进行用户状态的同步。
1.if
3. if
((this.Session["
].ToString()
)
(this.Session["
4. {
5. this.Response.Redirect("
Validate.aspx"
6. }
7. else
8. {
9. this.Response.Write("
10. this.Response.Write("
11. this.Response.Write("
12. this.Response.Write("
13. this.Response.Write("
14. this.Response.Write("
15. this.Response.Write("
16. this.Response.Write("
17. this.Response.Write("
18. this.Response.Write("
19. this.Response.Write("
20. }
21.}
22.else
23.{
24. this.Response.Redirect("
25.}
8、Shop的Synchronous.cs
好了,我们在Service中完成了登录,并把用户状态传递回Shop站点。
我们接着看用户状态是怎么同步的。
首先,如果Session里的Security是空字符串,则表示Shop站点没有向Service发送过请求,而Service向Shop发回了请求,这显然是错误的。
这次访问是由客户端伪造进行的访问,于是访问被拒绝了。
同样Security和InSecurity不相同,则表示请求和应答是不匹配的。
可能应答被纂改过了,所以应答同样被拒绝了。
当检验Security通过后,我们保证Serive完成了应答,并且返回了确切的参数,下面就是读出参数同步Shop站点和Service站点的用户即时状态。
1.string
InUserID
2.string
InPass
3.string
InSecurity
4.
5.string
6.if
(Security
)
8. byte[]
9. UnicodeEncoding
10. byte[]
11. SHA512Managed
12. Value
13. Security
14. foreach(byte
15. {
16. Security
17. }
18.
19. if
==
InSecurity)
20. {
21. if
(InPass
True"
22. {
23. this.Session["
int.Parse(InUserID);
24. this.Session["
true;
25. this.Response.Redirect(this.Session["
].ToString());
27. }
28. else
29. {
30. this.Response.Write("
31. this.Response.Write("
32. this.Response.Write("
33. this.Response.Write("
34. this.Response.Write("
35. this.Response.Write("
36. this.Response.Write("
37. this.Response.Write("
数据错误"
38. this.Response.Write("
39. this.Response.Write("
40. this.Response.Write("
41. }
42.}
43.else
44.{
45. this.Response.Write("
46. this.Response.Write("
47. this.Response.Write("
48. this.Response.Write("
49. this.Response.Write("
50. this.Response.Write("
51. this.Response.Write("
52. this.Response.Write("
访问错误"
53. this.Response.Write("
54. this.Response.Write("
55. this.Response.Write("
56.}
9、Shop的Page.cs
我们知道,页面在一段时间不刷新后,Session会超时失效,在我们一直访问Shop的时候怎么才能保证Service的Session不会失效呢?
很简单,我们返回来看Shop的Page.cs。
通过在所有Shop的页面内都用<iframe>嵌套Service的某个页面,就能保证Service能和Shop的页面同时刷新。
需要注意的一点是Service的Session必须保证不小于所有Shop和Office的Session超时时间。
这个在Web.config里可以进行配置。
1.this.Resp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单点 登陆 NET 简单 实现