如何在不同.net版本实现单点登录
所谓单点登录(single sign on就是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。其实对于程序员在技术上要实现就得就是多个不同域名间共享cookie的问题。
最近在为erp添加一个部署在另一台机器上,链接到原有老系统中的子项目,调用原有老项目中的login实现单点登录,尝试了n次屡试不成,最后确定问题,是,.net2.0与4.0中对cookie的加密/解密方法由此差异,于是经过研究,重写实现了一个可以在不同.net版本中实现单点登录的简单方法。
1,共用登陆页代码实现:
protected void btnlogin_click(object sender, eventargs e)
{
//认证开票,跳转到原始请求页面
system.web.security.formsauthentication.redirectfromloginpage("ejiyuan", false);
}
2,配置文件:
<!--访问权限控制-->
<authorization>
<deny users="?"/>
</authorization>
<!--身份认证方式-->
<authentication mode="forms">
<forms name=".aspnet" protection="all" enablecrossappredirects="true" loginurl="login.aspx" timeout="2880" path="/" domain=".local.com"/>
</authentication>
<!--验证算法-->
<machinekey validationkey="f9d1a2d3e1d3e2f7b3d9f90ff3965abdac304902" decryptionkey="f9d1a2d3e1d3e2f7b3d9f90ff3965abdac304902f8d923ac" validation="sha1" decryption="3des" /> <compilation debug="true"/>
这里:authentication/forms节点最重要的两个属性是name和protection. 所有实现单点登录的项目都要是相同的配置就这样,才可以在不同程序中同样的保护级别下读写cookie
当 protection属性设置为 "all",通过hash值进行加密和验证数据都存放在cookie中.默认的验证和加密使用的key都存储在machine.config文件,我们可以在应用程序的web.config文件覆盖这些值.默认值如下:
<machinekeyvalidationkey="autogenerate,isolateapps"decryptionkey=" autogenerate,isolateapps"validation="sha1" />
isolateapps表示为每个应用程序生成不同的key.我们不能使用这个.为了能在多个应用程序中使用相同的key来加密解密cookie,我们可以移除isolateapps 选项或者更好的方法是在所有需要实现sso的应用程序的web.config中设置一个具体的key值:
<machinekey validationkey="f9d1a2d3e1d3e2f7b3d9f90ff3965abdac304902" decryptionkey="f9d1a2d3e1d3e2f7b3d9f90ff3965abdac304902f8d923ac" validation="sha1" decryption="3des" /> <compilation debug="true"/>
如果你使用同样的存储方式,实现sso只是改动一下web.config而已,必须保证单点中的每个应用程序都有相同的配置,如果单点登录的应用程序是跨不同.net版本的,这里的加密/解密不要使用md5
<machinekey decryptionkey="8b6697227cbca902b1a0925d00faa00b353f2df4359d2099" validation="md5" validationkey="282487e295028e59b8f411acb689ccd6f39ddd2146055a3ee480424315994760adf21b580d8587db675fa02f7916813044e25309cccdb647174d5b3d0dd9141"/>
3,没有登录页的单点登录不需要代码 直接配置就可以了,配置如下
<authorization>
<deny users="?"/>
</authorization>
<authentication mode="forms">
<forms name=".aspnet" protection="all" enablecrossappredirects="true" loginurl="http://sso2.local.com/login.aspx" timeout="2880" path="/" domain=".local.com"/>
</authentication>
4,登录模块从定向代码封装在httpmodules*其他系统直接调用,这里附上封装代码与引用方法:
public class ssologinredirectmodule : ihttpmodule
{
public void init(httpapplication i_application)
{
// todo: add uploadmodule.init implementation
i_application.endrequest += new eventhandler(i_application_endrequest);
}
void i_application_endrequest(object sender, eventargs e)
{
if ((httpcontext.current.response.statuscode == 302) && httpcontext.current.response.redirectlocation.contains(formsauthentication.loginurl))
{
httpcontext.current.response.redirectlocation = formsauthentication.loginurl + "?returnurl=" + httputility.urlencode(httpcontext.current.request.url.originalstring);
}
}
public void dispose()
{
//throw new notimplementedexception();
}
}
引用:
<httpmodules>
<add name="ssomodule" type="ssomodule.ssologinredirectmodule, ssomodule"/>
</httpmodules>
下一篇: java实现留言板功能实例