ASP.NET站点跨子域名单点登陆(SSO)的实现
来源:互联网 发布:linux退出vi模式 编辑:程序博客网 时间:2024/04/30 07:24
ASP.NET站点跨子域名单点登陆(SSO)的实现
在MSDN的文档“配置跨应用程序的 Forms 身份验证(http://msdn2.microsoft.com/zh-CN/library/eb0zx8fc.aspx)” 中,提出了在Web Farm和多个应用程序之间实现共享身份登陆信息的方法。这个方法实现的其实是场环境下的身份共享,对于跨子域名的单点登陆,如网易和CSDN的通行证的实现,也有很多朋友给出了解决方案,参见:http://www.cnblogs.com/dudu/archive/2005/07/04/186279.html
Form验证其实是基于身份cookie的验证。客户登陆后,生成一个包含用户身份信息(包含一个ticket)的cookie,这个cookie的名字就是在web.config里Authentication节form设定的name信息,如
<authentication mode="Forms">
<forms loginUrl="login.aspx" name=".ASPXAUTH" path="/" protection="All" ></forms>
</authentication>
这里,.ASPNETAUTH就是这个Cookie的名字。通过在Request.Cookies集合里包含这个cookie,实现用户身份信息的传递。所以,共享身份验证信息的思路很简单:只要这个身份验证cookie能在自域名中共享,Form验证信息自然可以共享!
共享Cookie的文章网上很多,基本的做法就是设定Cookie的domain属性。cookie的domain指定了此cookie所关联的域。domain默认为String.Empty,表示关联的域是当前Request对应的域。如果domain设定一个子域名,如cookie.Domain="brookes.com",则表示此cookie关联brookes.com下所有的下级域。因此,可以被www.brookes.com/web2.brookes.com......等共享。
至此,实现跨子域名的Form验证信息共享的方法就很简单:
{
FormsAuthentication.SetAuthCookie(userName.Text, false);
HttpCookie cookie = Response.Cookies[FormsAuthentication.FormsCookieName];
cookie.Domain = ".brookes.com";
Response.Cookies.Add(cookie);
FormsAuthentication.RedirectFromLoginPage(userName,false);
}
这个代码说明的是实现的原理。这里,实现的自己写Form验证的过程。如果使用的是Login控件,由framework自己完成验证,怎么设定这个cookie的domain呢?
可以有三种方式:
1. 在Login.OnLoggedIn事件中处理。这个事件在用户通过身份验证后触发,验证cookie已经存在,可以修改其domain属性,代码参考上面;
2. 将验证用户、设定AuthCookie的过程写成一个HttpMoudle。这个方法稍负责,可google代码
3.有一个最最最简单的方法,在.net 2.0 中,Authticainon的forms元素新添了一个属性:domain。这个属性对应的就是form的AuthCookie的domain属性。因此,只需要在每个子域的web.config中作如下设置:
<authentication mode="Forms">
<forms loginUrl="login.aspx" name=".ASPXAUTH" path="/" protection="All" domain="brookes.com"></forms>
</authentication>
OK,现在你不需要作任何其他设置了,你的brookes.com下所有的子域都可以共享form验证身份信息了!
还要说明几点:
1. 这个domain属性会覆盖在httpCookie配置节的domain属性设置,但是只会影响到AuthCookie,其他cookie不受影响;
2. 看了上面这一条,当然会想到我可以设定httpCookies配置节,如:
<httpCookies domain="brookes.com"/>
效果是一样的。不同指出在于,httpCookies指定了站点内所有cookie的domain属性,这将导致站点内所有的cookie都可以在子域间共享!至于这种共享是需要还是该避免,根据需要具体判断。
3. 这个domain属性,我看到在有的文档里强调在前面加一个点,如domain=".brookes.com",而MS的文档里都没有这个点。根据我的测试结果,两个写法没有区别,效果一样。
- ASP.NET站点跨子域名单点登陆(SSO)的实现
- ASP.NET站点跨子域名单点登陆(SSO)的实现
- ASP.NET站点跨子域名单点登陆(SSO)的实现
- ASP.NET站点跨子域名单点登陆(SSO)的实现
- ASP.NET站点跨子域名单点登陆(SSO)的实现
- .net SSO单点登陆
- .net SSO单点登陆
- asp.net 多子域名实现单点登录
- asp.net简单实现单点登录(SSO)的方法
- JBoss下的单点登陆(SSO)技术实现分析
- 单点登陆SSO的实现原理
- ASP.NET Forms验证 实现子域名(SubDomain)共享登陆下的缺陷
- 实现ASP.NET网站之间的单点登陆(跨域共享Session)
- SSO单点登录和单点退出(跨顶级域名)
- 站点集群系统中实现简单的单点登录(SSO)
- 单点登陆.NET的实现
- 跨域名sso单点登录、利用p3p实现cookie跨域
- 最简单的单点登陆SSO系统的实现思路
- Nginx RTMP 功能研究
- CentOS 6.6安装Matlab R2014a UNIX版
- 图说Java —— 理解Java机制最受欢迎的8幅图
- MySQL模糊查询语法
- C++ 线程池的封装实现
- ASP.NET站点跨子域名单点登陆(SSO)的实现
- 卡马克魔数的研究
- 身份认证(shiro)
- 删除链表中重复的值
- 书名
- POJ 1755 Triathlon 判断不等式有解+半平面的交
- PB中一些技巧(非原创)
- Android笔记005_Android的mvc模式讲解
- 计算正整数的划分数