单点登陆(SSO),一个很老的问题.
详细内容请参考 Single Sign-On for everyone
Michael Morozov对很多情形的SSO做了阐述:
1. 父/子应用在虚拟子目录之间的SSO.
2. 不同授权凭证应用之间的SSO(用户名重映射)
3. 同根下的二级子域名应用之间的SSO
4. 不同.NET版本应用之间的SSO
5. 不同域名应用之间SSO.
6. 混合验证模式下的SSO(窗体验证/Windows验证)
尽管已经详细描述了这么多种情形,但我还是遇到了一点儿问题. 花了俺一天, 特此共享一下:
(我测试的是: http://localhost/test1/, http://localhost/test2/, http://localhost/test3/)
1. 在所有应用的web.config中设定相同的name,如.CROAUTH
<authentication mode="Forms">
<forms name=".CROAUTH" protection="All" loginUrl="Login.aspx" />
</authentication>
2. 所有应用的web.config的System.Web节点下添加machineKey,默认值是各个应用自动生成的
<machineKey validationKey="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902" decryptionKey="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902F8D923AC" validation="SHA1" />
3. 每个应用都是独自的登陆页面,验证后以RedirectFromLoginPage跳转.
if(fa.Login(strLogCode,strPassword))
FormsAuthentication.RedirectFromLoginPage(strLogCode, false);
4. 尽管号称SSO,他们仅共享cookie,跳转时有几个应用仍将建立几个Seesion.
各应用之间仅共享登陆名信息,需有Session补全信息机制.如根据LogCode取部门,邮件等.