對於大多數的web應用程式,很多人喜歡採用表單驗證的方法。當許多應用程式運行在一個主域下面的多個子域時,使用單點登入將是很不錯的一個選擇,當使用者在http://www.exapmle.com/登入之後,可以訪問everything.example.com的資源。
表單驗證預設不支援這種特性,但是,通過合適的方法調整它並不複雜。
ASP.NET表單驗證的技術內幕並不複雜:它建立了一個特殊的Cookie,這個cookie的名字由web.config中的forms元素的name定義,它包含加密的驗證資料,該cookie預設的名字是.ASPXAUTH。
出於保護使用者隱私和安全的原因,cookie預設和主機名稱關聯。但是cookie的機制支援一台主機的cookie在該主機所在的域內被接受,意味著主機server1.example.com的cookie可以在整個example.com中使用。
可以設定二級域和第三層網域的cookie,但是不允許設定頂級域的cookie,例如設定.com的cookie就是不允許的。
下面開始進行設定,看需要進行什麼工作。
開始設定
和其它的應用程式一樣,必須先在system.web中設定authentication,例如:
<authentication mode="Forms">
<forms name="DomainLoginAuth" loginUrl=" http://WebLogin/Default.aspx" protection="All"/>
</authentication>
正如前邊提到的,驗證的cookie是加密的,而加密的種子是隨機產生的。當需要多個伺服器協同工作時,那麼將需要相同的加密種子。在system.web中加入如下的一段:
<MACHINEKEY
validationKey="BD52058A3DEA473EA99F29418689528A494DF2B00054BB7C"
decryptionKey="684FC9301F404DE1B9565E7D952005579E823307BED44885"
/>
如果採用DES加密的話,使用16個16進位符號,如果使用SHA1加密的話,使用48個16進位符號,ASP.NET預設採用的SHA1加密。
開始登入驗證
必須在將驗證cookie發送給客戶之前,為cookie附加域資訊,代碼如下(假定使用者名稱和密碼已經經過驗證並且使用的使用者名稱儲存在userName變數中):
HttpCookie authCookie = FormsAuthentication.GetAuthCookie(userName, false);
authCookie.Domain = "example.com";
Response.Cookies.Add(authCookie);
Response.Redirect(FormsAuthentication.GetRedirectUrl(userName, false);
登出
通常,使用者登出時不需要進行什麼設定,只要調用FormsAuthentication.SignOut()即可,但是這個函數不能處理域的cookie。
因此,應該手工刪除這個cookie,手工刪除這個cookie的唯一方法是將cookie的到期時間設定為過去的時間,參考如下的代碼:
HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
authCookie.Domain = "example.com";
authCookie.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(authCookie);
好了,現在你的應用程式可以進行單點登入了。