欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何在不同.net版本实现单点登录

程序员文章站 2024-03-01 22:08:10
所谓单点登录(single sign on就是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。其实对于程序员在技术上要实现就得就是多个不同域名间共享c...

所谓单点登录(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>