一、什麼是單點登入
單點登入就是在多個web應用程式中,實現統一登入方式,一但登入了某web應用程式,其它相關聯的web應用程
序都無需再次登入,一個地方退出,所有相關聯的web應用程式都退出.
二、通過利用ASP.NET Forms驗證模式 可以實現子網域名稱(SubDomain)共用登陸下的缺陷
要利用Asp.NET Form驗證模式實現 同一主域下不同子網域名稱共用登陸狀態需要進行以下配置
配置Web.config
1.把Asp.net的認證模式改為Forms認證模式,domain 要等於你的應用程式對應的網域名稱,例如: .test.cn
<authentication mode="Forms">
<forms name=".ASPNETFORM" domain=".test.cn" loginUrl="/login.aspx" defaultUrl="/default.aspx"
protection="All" timeout="30" path="/" requireSSL="false" slidingExpiration="true"
enableCrossAppRedirects="false" cookieless="UseDeviceProfile" />
</authentication>
2.配置針對儲存在cookie中的票據資訊進行加密解密的方式
<machineKey
validationKey="CF10047DB84FBA7F418BF30F9697B1D6EDDA3A90837F3C57B336B4016E47986135B31B2432F7CB20A6858DFFB
E4E5ECD1451E17C91830993445D0EA5708BABBD" decryptionKey="5D37DDB652B86956" validation="SHA1"/>
備忘:產生machineKey網址
http://www.aspnetresources.com/tools/keycreator.aspx
登陸建立驗證票據
1.應用程式登陸頁面(Login.aspx)輸入使用者名稱、密碼並驗證通過後,建立一張加密過的驗證票據,並儲存在cookie中
//建立驗證票
FormsAuthenticationTicket ticket
= new FormsAuthenticationTicket(1, name, DateTime.Now,
DateTime.Now.AddDays(1d), false,
HttpContext.Current.Request.UserHostAddress
);
string authTicket = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, authTicket);
cookie.Domain = ConfigurationManager.AppSettings["SSODomain"];
HttpContext.Current.Response.Cookies.Add(cookie);
2.登陸完畢後進入有許可權的頁面,並可得到驗證通過後的ID User.Identity.Name;
if (!User.Identity.IsAuthenticated)
{
//未登入
Response.Redirect("/login.aspx");
}
string name = User.Identity.Name;
3.登出頁面,清空使用者資訊,並銷毀票據
HttpContext.Current.Session.Clear();
FormsAuthentication.SignOut();
三、Forms驗證 實現子網域名稱(SubDomain)共用登陸下的缺陷
根據以上講解,均可實現同一主網域名稱下的多個子網域名稱共用登陸狀態,但是主網域名稱有所限制,當主網域名稱為1個字母,而尾碼為2個字母的網域名稱,不能通過認證,例如:a.cn網域名稱,a.jp網域名稱 均不能實現子網域名稱共用登陸,而其他網域名稱均能實現,例如:a.test.com, a.sina.cn 等,大家亦可通過修改hosts檔案實驗一下,如有高手知道怎麼解決這個問題的,請指教,謝謝!!並附上 Demo程式 ,請大家指教!
PS:因本人公司的網域名稱為p.cn,想通過Form認證的模式實現子網域名稱共用登陸狀態,但是死活用不上!~~!!汗,不知道這個算不算微軟的Bug。