不同.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 >

转载于:https://www.cnblogs.com/panlijuan/archive/2011/10/09/2203795.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值