經過研究
重寫實現了一個可以在不同
net版本中實現單點登錄的簡單方法
現在和大家分享一下
不足之處還望見諒
所謂單點登錄(Single Sign On就是在多個應用系統中用戶只需要登錄一次就可以訪問所有相互信任的應用系統其實對於程序員在技術上要實現就得就是多個不同域名間共享cookie的問題
最近在為ERP添加一個部署在另一台機器上鏈接到原有老系統中的子項目調用原有老項目中的Login實現單點登錄嘗試了N次屢試不成最後確 定問題是net與中對cookie的加密/解密方法由此差異於是經過研究重寫實現了一個可以在不同net版本中實現單點登錄的簡 單方法
共用登陸頁代碼實現
復制代碼 代碼如下:
protected void btnLogin_Click(object sender
EventArgs e)
{
//認證開票
跳轉到原始請求頁面
System
Web
Security
FormsAuthentication
RedirectFromLoginPage("ejiyuan"
false);
}
配置文件
復制代碼 代碼如下:
<!
訪問權限控制
>
<authorization>
<deny users="?"/>
</authorization>
<!
身份認證方式
>
<authentication mode="Forms">
<forms name="
ASPNET" protection="All" enableCrossAppRedirects="true" loginUrl="Login
aspx" timeout="
" path="/" domain="
local
com"/>
</authentication>
<!
驗證算法
>
<machineKey validationKey="F
D
A
D
E
D
E
F
B
D
F
FF
ABDAC
" decryptionKey="F
D
A
D
E
D
E
F
B
D
F
FF
ABDAC
F
D
AC" validation="SHA
" decryption="
DES" /> <compilation debug="true"/>
這裡authentication/forms節點最重要的兩個屬性是name和protection 所有實現單點登錄的項目都要是相同的配置就這樣才可以在不同程序中同樣的保護級別下讀寫Cookie
當 protection屬性設置為 "All"通過Hash值進行加密和驗證數據都存放在Cookie中默認的驗證和加密使用的Key都存儲在machineconfig文件我們可以在應用程序的WebConfig文件覆蓋這些值默認值如下:
<machineKeyvalidationKey="AutoGenerateIsolateApps"decryptionKey=" AutoGenerateIsolateApps"validation="SHA" />
IsolateApps表示為每個應用程序生成不同的Key我們不能使用這個為了能在多個應用程序中使用相同的Key來加密解密cookie 我們可以移除IsolateApps 選項或者更好的方法是在所有需要實現SSO的應用程序的WebConfig中設置一個具體的Key值:
<machineKey validationKey="FDADEDEFBDFFFABDAC" decryptionKey="FDADEDEFBDFFFABDACFDAC" validation="SHA" decryption="DES" /> <compilation debug="true"/>
如果你使用同樣的存儲方式實現SSO只是改動一下Webconfig而已必須保證單點中的每個應用程序都有相同的配置如果單點登錄的應用程序是跨不同net版本的這裡的加密/解密不要使用md
<machineKey decryptionKey="BCBCABADFAABFDFD" validation="MD" validationKey="EEBFACBCCDFDDDAEEADFBDDBFAFECCCDBDBDDD"/>
沒有登錄頁的單點登錄不需要代碼 直接配置就可以了配置如下
復制代碼 代碼如下:
<authorization>
<deny users="?"/>
</authorization>
<authentication mode="Forms">
<forms name="
ASPNET" protection="All" enableCrossAppRedirects="true" loginUrl="
</authentication>
登錄模塊從定向代碼封裝在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 ((HttpContextCurrentResponseStatusCode == ) && HttpContextCurrentResponseRedirectLocationContains(FormsAuthenticationLoginUrl))
{
HttpContextCurrentResponseRedirectLocation = FormsAuthenticationLoginUrl + "?ReturnUrl=" + HttpUtilityUrlEncode(HttpContextCurrentRequestUrlOriginalString);
}
}
public void Dispose()
{
//throw new NotImplementedException();
}
}
引用
復制代碼 代碼如下:
<httpModules>
<add name="SsoModule" type="SsoModuleSsoLoginRedirectModule SsoModule"/>
</httpModules>
From:http://tw.wingwit.com/Article/program/net/201311/14109.html