原文地址:http://www.wlm.so/Article/Detail/lmb48bk9f690n00000
單點登錄,這種在網絡非常常見,在這裡討論的是實現同一主域下的子站間的單點登錄,同樣也適用於使用負載均衡後站點的登錄識別。
.net,討論基於MVC環境下的,假設域名為 wlm.so。
基礎條件:
1.cookie共享
2.FormsAuthentication加密
3.服務器端處理
還是一樣,從原理開始:
原理非常簡單,所有登錄後,將用戶的標識放在客戶端的cookie裡面,通過cookie共享,每次請求服務器端將客戶端發送的cookie直接當成標識來識別用戶。
這個過程中安全就非常重要了,怎麼做到安全呢?
FormsAuthentication認證,FormsAuthenticationTicket票據加密。
1.cookie共享
假設主域為wlm.so,子域為a.wlm.so以及b.wlm.so。
那麼在服務器端寫入cookie時必須為cookie指定主域。代碼如下:
那麼當cookie未過期時,打開a.wlm.so或者打開b.wlm.so時該cookie就會相應的被提交。
2.FormsAuthentication加密
假設,我們在cookie寫上用戶名的話,那將是非常的不安全,因此使用FormsAuthentication驗證方式,通過FormsAuthentication創建驗證票據,將票據保存在客戶端。
首先上代碼:
webconfig配置票據代碼:
票據創建與寫入代碼,login.LoginName是登錄名,也是用戶標識:
通過創建票據後,寫入客戶端cookie,如果需要記錄登錄信息,請加上cookie過期時間即可。
通過上述創建的票據將被寫在cookie中,訪問主域下的二級網站時均會被提交。但是不同IIS該票據加密密鑰是不一樣的,因此無法識別,需要配置密鑰讓不同服務器上的IIS都能識別驗證票據。
3.FormsAuthentication密鑰生成與配置
只需要在webconfig中增加配置即可:
該配置中附帶著加密密鑰與解密密鑰以及加密方式,密鑰不是隨意生成的,附帶生成代碼:
點擊下載生成代碼
4.服務器識別到用戶標識後,需要進行session記錄,或者其他記錄方式即可通過通常代碼實現,這裡不做討論。服務器端獲取用戶登錄名如下:
a)判斷用戶是否已經登錄
if(httpContext.User.Identity.IsAuthenticated){
//已經登錄
}
b)獲取登錄名
string name=HttpContext.Current.User.Identity.Name;//即前文中的login.loginName
附上代碼:
HttpCookie cookie = new System.Web.HttpCookie("cookiename", "cookievalue");
cookie.Domain = "wlm.so";
System.Web.HttpContext.Current.Response.Cookies.Add(cookie);
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1,// 版本號。
u.Id,// 與身份驗證票關聯的用戶名。
DateTime.Now,// Cookie 的發出時間。
DateTime.Now.AddMinutes(1000),// Cookie 的到期日期。
login.Persistent != 0,// 如果 Cookie 是持久的,為 true;否則為 false。
login.LoginName//寫入用戶名稱
);
HttpCookie cookie =
new System.Web.HttpCookie(FormsAuthentication.FormsCookieName,
FormsAuthentication.Encrypt(ticket));
cookie.Domain = "wlm.so";
System.Web.HttpContext.Current.Response.Cookies.Add(cookie);
return LoginState.Success;
<authentication mode="Forms">
<forms name="FormsAuthCookie"
path="/" loginUrl="~/Login"
domain="wlm.so" />
</authentication>
<machineKey validationKey="****"
decryptionKey="***"
validation="SHA1"/>
代碼不能帖給你 不好意思....
使用 CAS-server組件 一般的,單點登錄都是使用LDAP數據庫
我之前給學校做過一個基於SOA的校園統一管理構建 使用的就是這套配置 不錯呀不錯 呵呵~~
單點登錄的重點是:無論兩個網站地域和服務器是否分離,只要他們服務器上面都有你單點登錄服務器上的證書存根即可... 所以不需要關心什麼域名之類的東西 只要證書存根在每個網站上 一切好說
你的思路有些問題:單點登錄並不是對網站cookies的傳遞 它是基於https的一種安全機制的東東 也就是ca證書 如果用cookies傳遞的話,你就會遇到跨網站時cookies共享問題,這是個思路死角
看你怎麼做了,有開源框架可以幫助你,!
一般用spring 的security比較不錯