程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 如何在不同.net版本實現單點登錄

如何在不同.net版本實現單點登錄

編輯:關於ASP.NET
    經過研究,重寫實現了一個可以在不同.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>

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved