http://blog.csdn.net/jason_dct/article/details/8502075

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验证信息共享的方法就很简单:

 if (Membership.ValidateUser(userName, password))
          ...{
                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的文档里都没有这个点。根据我的测试结果,两个写法没有区别,效果一样。

-----------------------------------------------------------------------------------------------------------------------------------------

1 对于纯web得sso,如果有独立得SSO登陆服务器,所有的验证都跳转到这个服务器的界面,登陆的状态保留在sso server上

2 如果要桌面和web共同认证,还是必须有独立得SSO,

对于自己实现的方案,例如如果是通过一个桌面程序来实现SSO,那么必须有一台SSO服务器,桌面程序通过httpclient验证身份,然后可以通过
a. 修改本机cookies让IE传认证令牌
b. 直接把认证令牌作为url字符串根在桌面程序的一个链接后面

令牌说法比较含糊,具体两种方法:
1 所有得url均复写令牌
2 只要保留浏览器对SSO web server的cookies,跳转应用程序的时候,web app先redirect到ssoserver,验证cookies后,跳回来,对用户来说,感觉不到去过ssoserver,呵呵,

很多网站,例如google好像就是这个方法

jaas本质上只解决一个登录可配置的问题,像tomcat用jaas,只能解决同时登陆tomcat上得N个应用,而且仅限于java,对SSO实现还是要按上面的方法。kerberos往往是和系统一

些模块紧密结合的,扩展不一定方便。

3 如果windows是唯一登录入口,也就是没有第二台SSO登录服务器。
那么实现SSO的核心,就是登录域之后,IE能够把域信息发送给服务端:

配置IE浏览器
  ①internet选项-->安全-->本地intranet-->站点-->高级
  添加wls
  ②internet选项-->高级-->安全
  确定,集成windows身份认证被选中

服务段的weblogic接收到这个令牌以后,要去AD上验证

集成Windows身份验证(以前称为NTLM身份验证和Windows NT质询/响应身份验证)可以使用NTLM或Kerbetas身份验证,NTLM是Microsoft的一项专有技术,自问世以来已几经更新,

虽然这种机制稳定可靠但它有一个致命缺点是不能进行委派,这就意味着用户凭据不能流动到远程服务(如SQL Server)。而Kerberos却不存在这种问题,在保持稳定安全的验证机

制的同时还可以在Windows环境中轻松地使用委派,我们要讨论的就是这种机制。

Kerberos大多数情况下要求使用Microsoft Active Directory,因为Active Directory 充当Kerberos令牌授予服务(TGS/TGT)。

如果用kerberos,那就很简单了,windows和weblogic都支持kerberos,认证数据都在AD上
参考资料  http://edocs.bea.com.cn/wls/docs92/secmanage/sso.html

from:http://www.cnblogs.com/csdnexpert/archive/2007/12/17/999415.html

-------------------------------------------------------------------------------------------------------------------------------------------

Java SSO参考:http://www.cnblogs.com/hannover/archive/2009/10/15/1583692.html

转载于:https://www.cnblogs.com/8090sns/archive/2013/01/22/2871322.html

ASP.NET站点跨子域名单点登陆(SSO)的实现相关推荐

  1. 单点登陆(SSO)组件的设计与实现一 【转】

    更新:新增登录流程图: [原创]单点登陆(SSO)组件的设计与实现二-登录流程图  先说几句废话,自我感觉此方案还不错,至少解决了安全性的问题,也实现了统一登出,能跨平台,跨服务期,跨域名,当然需要相 ...

  2. LoongSSO 大中型WEB系统单点登陆(SSO)整合利器

    LoongSSO 大中型WEB系统单点登陆(SSO)整合利器 2012-01-13 11:35:46 分类: 网络与安全 我们都知道网易.搜狐等大型门户都有"通行证"的概念,这个通 ...

  3. cookies可以跨域了~单点登陆(a.com.cn与b.com.cn可以共享cookies)

    如果您的a.com.cn站点需要与b.com.cn站点共享cookies,一般满足这种要求的系统是为了做单点登陆的,现在我来讲一下实现方法: a.com.cn登陆后,写cookies,在b.com.c ...

  4. Spring Security、oauth2、单点登陆SSO的关系

    文章目录 概述 1. 什么是Spring Security 1.1 配置示例 1.2 spring security 基本原理 1.2 Spring Security存在的问题 2. 什么是oauth ...

  5. .net 实现Cookie跨域共享,单点登录SSO

    实现原理:cookie是不能跨域访问的,但是在二级域名是可以共享cookie的 概念说明:站点1=a.devin.com   站点2=b.devin.com 实现步骤:1. 配置两个站点的webcon ...

  6. 完全跨域的单点登录(SSO)解决方案源码解析

    为什么80%的码农都做不了架构师?>>>    本文介绍的是一种PHP的开源SSO解决方案,可完全跨域,实现较简洁,源码地址:https://github.com/legalthin ...

  7. 实现基于 ASP.NET Forms 身份验证的跨子域单点登录

    对于跨应用程序的 ASP.NET Forms 身份验证,相信大家应该都不陌生,几年前很多文章都介绍了如何实现,比如 MSDN 的 跨应用程序进行 Forms 身份验证,唐朝程序员 的 ASP.NET站 ...

  8. php discuz 单点登录,有关单点登陆的课程推荐10篇

    摘要:本文主要介绍了利用webservice,session,cookie技术,来进行通用的单点登录系统的分析与设计.具体实现语言为PHP.单点 登录,英文名为Single Sign On,简称为 S ...

  9. php session 域,PHP session 跨子域问题总结

    今天,做项目时候遇到个问题.之前做东西的时候session一般就直接存在数据库中这样就能解决跨域 不仅仅是跨子域,但是今天遇到这个问题是,自己要在别人现有的东西上面做修改.由于仅仅是子域 当时就行肯定 ...

最新文章

  1. 网络空间安全之信息追踪——学习笔记 利用门户网站,综合信息追踪
  2. java将clob类型文件写到磁盘_Java对Oracle中Clob类型数据的读取和写入
  3. mysql中的各种join整理
  4. 三、PHP框架Laravel学习笔记——路由参数、重定向、视图
  5. Spring boot 项目目录结构
  6. python版本时间_python 获取文件版本号和修改时间
  7. 清退117名博士、119名硕士!研究生“严出”成人才培养大趋势
  8. 两种添加数据到DropDownList 控件的方法
  9. 音频插件使用(wavesurfer.js)
  10. 元月元日是哪一天_元宵节的农历日期是哪一天 - 中国万年历
  11. 《软件架构与设计模式》思维导图
  12. 计算机为什么无法搜索功能,电脑搜索功能不能用怎么办?电脑搜索不能用的解决方法...
  13. CeoMax总裁WordPress模板3.8.1免受权版本
  14. Android中Device Provisioned引起的问题分析
  15. java生成唯一的五位字符串_java唯一字符串ID生成方案详解
  16. 宜信微服务架构落地及其演进
  17. 2023年全国最新二级建造师精选真题及答案49
  18. 学习SEO就到SEOWHY,SEO十万个为什…
  19. SQL学习笔记(完整)
  20. FF4J(特性框架)简介及入门

热门文章

  1. python 获取当前文件夹下所有文件名
  2. 机器学习模型评估指标总结
  3. AtCoder Grand Contest 023 C - Painting Machines
  4. ASP.NET(c#)实现重定向的三种方法的总结
  5. Android 颜色渲染(九) PorterDuff及Xfermode详解
  6. 【好用的ORM框架】
  7. 使用某个文件夹下的所有文件去替换另一个文件夹下及其子文件夹下存在的同名文件(Python实现)...
  8. android记事本项目案例,Android实现记事本项目完整实例源代码
  9. define 字符串_C++如何使用define关键字以便使用中文编程?
  10. jedis jedispool Redistemplate