流量统计:
Rixu Blog (日需博客)
日需博客,每日必需来踩踩哦..
posts - 108,comments - 54,trackbacks - 0

最近在做一个登录功能,纠结了好几天,一直在找一个能优雅的实现单点登录的功能。博客园有看到某人写了又臭又长的八股文式的文章,没看到有价值的东西。

其实单点登录最终要解决的是多个不同域名间共享cookie的问题。但是要在不同域名间共享cookie是一件很困难的事情,要在某个域名下面种cookie就必须访问该

域名。网上有很多方法,看到的有动态创建iframe实现,在iframe里面访问某个域名的页面种下cookie,该方法需要写一些js代码,写起来有点累,所以我最终

选择了用页面跳转来实现,想不到效果比我预期的好很多,浏览器几乎看不出来有跳转的痕迹。

详细介绍下流程:

1. 项目有3个不同的域名,login.susucms.com, suhow.com, sigcms.com。其中login.susucms.com/login.aspx是登录页面。实现的功能是通过login.susucms.com/login.aspx登录后能够实现在访问其他域名也可以保持登录状态。

2. 在suhow.com和sigcms.com下分别添加一个sso.aspx的页面。

3. 当用户在login.susucms.com/login.aspx页面点击登录,服务器端通过验证后生成一个token,接着服务器端Response.Redirect到suhow.com/sso.aspx,suhow.com/sso.aspx立即验证这个token是否合法,如果合法则Reponse一个包含登录信息的cookie,然后Response.Redirect到sigcms.com/sso.aspx,sigcms.com/sso.aspx也验证这个token是否合法,如果合法则Reponse一个包含登录信息的cookie,然后销毁token,Response.Redirect到登录后的后台。

整个流程最核心的其实就是跳转。没有其他的了。经过测试,服务器端响应非常快,几乎感觉不到任何跳转,所以再多跳转几个域名,我想是没有什么大问题的。

简单代码:

1. login.susucms.com/login.aspx

01 if (IsLogin)
02 {
03     var login = new CrossDomainLogin
04     {
05         Key = Guid.NewGuid().ToString(),
06         CreateTime = DateTime.Now
07     };
08     DataContext.CrossDomainLogins.InsertOnSubmit(login);
09     DataContext.SubmitChanges();
10  
11     WriteAuthenticationCookie();
12     Response.Redirect("http://suhow.com/sso.aspx?key=" + login.Key);
13 }

2. suhow.com/sso.aspx

01 var key = Request.QueryString["key"];
02 var login = DataContext.CrossDomainLogins.FirstOrDefault(i => i.Key == key);
03 if (login != null)
04 {
05     // key will be expired in 3 minutes
06    if (DateTime.Now > login.CreateTime.AddMinutes(3))
07    {
08         RemoveKey(login);   // delete key from database
09         Response.Redirect("http://login.susucms.com/login.aspx");
10     }
11     else
12     {
13         WriteAuthenticationCookie();
14         Response.Redirect("http://sigcms.com/sso.aspx?key=" + login.Key);
15     }
16 }
17 else
18 {
19     // ....
20 }

3. sigcms.com/sso.aspx

01 var key = Request.QueryString["key"];
02 var login = DataContext.CrossDomainLogins.FirstOrDefault(i => i.Key == key);
03 if (login != null)
04 {
05     // key will be expired in 3 minutes
06     if (DateTime.Now > login.CreateTime.AddMinutes(3))
07     {
08         RemoveKey(login);   // delete key from database
09         Response.Redirect("http://login.susucms.com/login.aspx");
10     }
11     else
12     {
13         WriteAuthenticationCookie();
14         RemoveKey(login);   // delete key from database
15      Response.Redirect("http://login.susucms.com/admin/default.aspx");
16     }
17 }
18 else
19 {
20     // ....
21 }

  

Logo
作者:Gezidan
出处:http://www.rixu.net    
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted on 2011-09-27 10:54 日需博客 阅读(783) 评论(0)  编辑 收藏 引用 所属分类: C#技术文章转载

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理