ASP.NET站点跨子域名单点登陆(SSO)的实现
?
http://blog.csdn.net/jason_dct/article/details/8502075
?
ASP.NET站點跨子域名單點登陸(SSO)的實現
在MSDN的文檔“配置跨應用程序的 Forms 身份驗證(http://msdn2.microsoft.com/zh-CN/library/eb0zx8fc.aspx)”?中,提出了在Web Farm和多個應用程序之間實現共享身份登陸信息的方法。這個方法實現的其實是場環境下的身份共享,對于跨子域名的單點登陸,如網易和CSDN的通行證的實現,也有很多朋友給出了解決方案,參見:http://www.cnblogs.com/dudu/archive/2005/07/04/186279.html
Form驗證其實是基于身份cookie的驗證。客戶登陸后,生成一個包含用戶身份信息(包含一個ticket)的cookie,這個cookie的名字就是在web.config里Authentication節form設定的name信息,如
<authentication mode="Forms">
???<forms loginUrl="login.aspx" name=".ASPXAUTH" path="/" protection="All" ></forms>
?</authentication>
這里,.ASPNETAUTH就是這個Cookie的名字。通過在Request.Cookies集合里包含這個cookie,實現用戶身份信息的傳遞。所以,共享身份驗證信息的思路很簡單:只要這個身份驗證cookie能在自域名中共享,Form驗證信息自然可以共享!
共享Cookie的文章網上很多,基本的做法就是設定Cookie的domain屬性。cookie的domain指定了此cookie所關聯的域。domain默認為String.Empty,表示關聯的域是當前Request對應的域。如果domain設定一個子域名,如cookie.Domain="brookes.com",則表示此cookie關聯brookes.com下所有的下級域。因此,可以被www.brookes.com/web2.brookes.com......等共享。
至此,實現跨子域名的Form驗證信息共享的方法就很簡單:
?if?(Membership.ValidateUser(userName,?password))??????????...{
????????????????FormsAuthentication.SetAuthCookie(userName.Text,?false);
????????????????HttpCookie?cookie?=?Response.Cookies[FormsAuthentication.FormsCookieName];
????????????????cookie.Domain?=?".brookes.com";
????????????????Response.Cookies.Add(cookie);
????????????????FormsAuthentication.RedirectFromLoginPage(userName,false);
????????????}
這個代碼說明的是實現的原理。這里,實現的自己寫Form驗證的過程。如果使用的是Login控件,由framework自己完成驗證,怎么設定這個cookie的domain呢?
可以有三種方式:
1. 在Login.OnLoggedIn事件中處理。這個事件在用戶通過身份驗證后觸發,驗證cookie已經存在,可以修改其domain屬性,代碼參考上面;
2. 將驗證用戶、設定AuthCookie的過程寫成一個HttpMoudle。這個方法稍負責,可google代碼
3.有一個最最最簡單的方法,在.net 2.0 中,Authticainon的forms元素新添了一個屬性:domain。這個屬性對應的就是form的AuthCookie的domain屬性。因此,只需要在每個子域的web.config中作如下設置:
<authentication mode="Forms">
???<forms loginUrl="login.aspx" name=".ASPXAUTH" path="/" protection="All" domain="brookes.com"></forms>
?</authentication>
OK,現在你不需要作任何其他設置了,你的brookes.com下所有的子域都可以共享form驗證身份信息了!
還要說明幾點:
1. 這個domain屬性會覆蓋在httpCookie配置節的domain屬性設置,但是只會影響到AuthCookie,其他cookie不受影響;
2. 看了上面這一條,當然會想到我可以設定httpCookies配置節,如:
?? <httpCookies domain="brookes.com"/>
? 效果是一樣的。不同指出在于,httpCookies指定了站點內所有cookie的domain屬性,這將導致站點內所有的cookie都可以在子域間共享!至于這種共享是需要還是該避免,根據需要具體判斷。
3. 這個domain屬性,我看到在有的文檔里強調在前面加一個點,如domain=".brookes.com",而MS的文檔里都沒有這個點。根據我的測試結果,兩個寫法沒有區別,效果一樣。
?
-----------------------------------------------------------------------------------------------------------------------------------------
1 對于純web得sso,如果有獨立得SSO登陸服務器,所有的驗證都跳轉到這個服務器的界面,登陸的狀態保留在sso server上
2 如果要桌面和web共同認證,還是必須有獨立得SSO,
對于自己實現的方案,例如如果是通過一個桌面程序來實現SSO,那么必須有一臺SSO服務器,桌面程序通過httpclient驗證身份,然后可以通過
a. 修改本機cookies讓IE傳認證令牌
b. 直接把認證令牌作為url字符串根在桌面程序的一個鏈接后面
令牌說法比較含糊,具體兩種方法:
1 所有得url均復寫令牌
2 只要保留瀏覽器對SSO web server的cookies,跳轉應用程序的時候,web app先redirect到ssoserver,驗證cookies后,跳回來,對用戶來說,感覺不到去過ssoserver,呵呵,
很多網站,例如google好像就是這個方法
jaas本質上只解決一個登錄可配置的問題,像tomcat用jaas,只能解決同時登陸tomcat上得N個應用,而且僅限于java,對SSO實現還是要按上面的方法。kerberos往往是和系統一
些模塊緊密結合的,擴展不一定方便。
3 如果windows是唯一登錄入口,也就是沒有第二臺SSO登錄服務器。
那么實現SSO的核心,就是登錄域之后,IE能夠把域信息發送給服務端:
? 配置IE瀏覽器
? ①internet選項-->安全-->本地intranet-->站點-->高級
? 添加wls
? ②internet選項-->高級-->安全
? 確定,集成windows身份認證被選中
服務段的weblogic接收到這個令牌以后,要去AD上驗證
集成Windows身份驗證(以前稱為NTLM身份驗證和Windows NT質詢/響應身份驗證)可以使用NTLM或Kerbetas身份驗證,NTLM是Microsoft的一項專有技術,自問世以來已幾經更新,
雖然這種機制穩定可靠但它有一個致命缺點是不能進行委派,這就意味著用戶憑據不能流動到遠程服務(如SQL Server)。而Kerberos卻不存在這種問題,在保持穩定安全的驗證機
制的同時還可以在Windows環境中輕松地使用委派,我們要討論的就是這種機制。
Kerberos大多數情況下要求使用Microsoft Active Directory,因為Active Directory 充當Kerberos令牌授予服務(TGS/TGT)。
如果用kerberos,那就很簡單了,windows和weblogic都支持kerberos,認證數據都在AD上
參考資料? http://edocs.bea.com.cn/wls/docs92/secmanage/sso.html
?
from:http://www.cnblogs.com/csdnexpert/archive/2007/12/17/999415.html
?
?
-------------------------------------------------------------------------------------------------------------------------------------------
Java SSO參考:http://www.cnblogs.com/hannover/archive/2009/10/15/1583692.html
轉載于:https://www.cnblogs.com/8090sns/archive/2013/01/22/2871322.html
總結
以上是生活随笔為你收集整理的ASP.NET站点跨子域名单点登陆(SSO)的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: perl的几个for循环判断
- 下一篇: 工程造价管理