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

 更新时间:2013年07月23日 09:54:29   作者:  
经过研究,重写实现了一个可以在不同.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>

相关文章

  • .NET 6开发TodoList应用之实现PUT请求

    .NET 6开发TodoList应用之实现PUT请求

    PUT请求本身其实可说的并不多,过程也和创建基本类似。这篇文章主要为大家介绍了.NET6实现PUT请求的示例详解,感兴趣的小伙伴可以跟随小编一起学习一下
    2021-12-12
  • 更方便快捷的外部操作数据库的方法(另类玩法)

    更方便快捷的外部操作数据库的方法(另类玩法)

    数据库操作方法很多,各种各样但是外部操作数据库的方法就会显得格外陌生了,感兴趣的朋友可以详细了解下本文,或许对你学习ado.net有所帮助
    2013-02-02
  • 打造自己的.NET Core项目模板

    打造自己的.NET Core项目模板

    这篇文章主要介绍了打造自己的.NET Core项目模板,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • asp.net下用服务器端代码解决浏览器兼容性问题

    asp.net下用服务器端代码解决浏览器兼容性问题

    在你不厌其烦的搞浏览器兼容性问题的时候不妨试下这个方法 任何一种网页编程语言都能实现,基于获取用户请求信息的判断浏览器类型
    2010-01-01
  • asp.net core配置文件加载过程的深入了解

    asp.net core配置文件加载过程的深入了解

    这篇文章主要给大家介绍了关于asp.net core配置文件加载过程的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2018-12-12
  • .Net Core中使用ExceptionFilter过滤器的方法

    .Net Core中使用ExceptionFilter过滤器的方法

    这篇文章主要介绍了.Net Core中使用ExceptionFilter过滤器的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • asp.NET 脏字过滤算法

    asp.NET 脏字过滤算法

    asp.NET 脏字过滤算法,需要参考上一篇文章,大家可以比较下。
    2009-10-10
  • ADO.NET防SQL注入与使用参数增删改查

    ADO.NET防SQL注入与使用参数增删改查

    这篇文章介绍了ADO.NET防SQL注入与使用参数实现增删改查的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • asp.net下PageMethods使用技巧

    asp.net下PageMethods使用技巧

    ASP.net AjAX中的PageMethods可以将静态页方法添加到 ASP.NET 页中并将其用作 Web 方法。然后,无需创建单独的 .asmx 文件即可从该页中的脚本调用这些方法,就好像这些方法是 Web 服务的一部分。特别是在一些交互流程不复杂而调用次数和方法又比较多的情况下更为方便。因为PageMethods不需要我们再添加另外的WEB服务或Page来处理请求。
    2008-03-03
  • System.Web.Routing入门及进阶

    System.Web.Routing入门及进阶

    System.Web.Routing已经作为一个程序集包含在.net3.5sp1中发布了。虽然我们并没有在3.5sp1中发现Asp.net Mvc的踪迹,但是亦以感觉到它离我们不远了
    2011-12-12

最新评论