每個網站幾乎都會有用戶登錄的模塊,登錄就會涉及到身份驗證的過程。通常的做法是在頁面上有個登錄的Form,然后根據用戶名和密碼到數據庫中去進行驗證。
而驗證后如何在網站的各個頁面維持這種認證過的狀態,有時需要自己去實現(通過cookie或者其他的方式)。
然而,asp.net提供了幾種身份驗證的機制,可以方便我們進行驗證。其中常用的是Forms和Windows。目前的需求是在原有的系統上增加AD驗證
目前系統的概況是:
1.服務器與客戶端不在同一個域里。(測試服務器與客戶端在同一個域中)
2.現有網站的身份認證使用的是Forms。
因此,通過查閱資料,發現要想實現自動AD驗證,即加入域的用戶只要打開網站的登錄頁,不需要任何輸入就能自動登錄到系統中去,需要將身份認證模式改為Windows。
通過逐步的嘗試,總結一下我的操作步驟:
1.修改webconfig的驗證節點為windows驗證
<authentication mode="Forms"> <forms loginUrl="~/logon.aspx" name="ESSAuthForm" timeout="10" protection="All" path="/"> <credentials passwordFormat="MD5"> <user name="username" password="password"/> </credentials> </forms> </authentication>
這是原有的web.config中的配置節點,需要改為:<authentication mode="Windows">,然后注釋掉里面的節點。
2. IIS目錄安全性中不啟用匿名訪問,並且勾選集成windows身份驗證。
3. 登錄頁末尾調用LDAP驗證方法,實現自動驗證。
驗證代碼為:
public static string GetUserLoginName(HttpContext context) { if (context == null) return null; if (context.Request.IsAuthenticated == false) return null; DBLog.Debug("context.User.Identity.Name is:" + context.User.Identity.Name); string userName = context.User.Identity.Name; // 此時userName的格式為:UserDomainName\LoginName // 我們只需要后面的LoginName就可以了。 string[] array = userName.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries); if (array.Length == 2) return array[1]; DBLog.Debug("userName is:" + userName); return userName;//null; }
其原理是讓IIS完成了AD驗證並將驗證結果放到了 context.User.Identity對象里。
這個方法返回了域賬號的登錄名,通過一張域賬號登錄名與原系統賬號的登錄名的對應關系表,可以查到原系統的登錄名。調用相關的登錄方法進行登錄。
4.瀏覽器設置。
想要不讓IE彈出用戶名密碼框,需要將地址加到本地Intranet中。
5.
由於原系統是采用Forms身份驗證,退出時需要進行一些清理工作,需要調用清理相關的代碼。因此,避免退出時候的資源清理異常,刪掉了Ess.WebSite.dll中的Logout類中的page_load方法的 FormsAuthentication.SignOut()方法,同時將最后一個重定向語句由Response.Redirect(FormsAuthentication.LoginUrl,fasle)改為Response.Redirect("~/logon.aspx?logout=true",fasle),加個logout的參數目的是防止首頁繼續執行BeginLDAP()這個方法。
if (Request.QueryString["logout"] == null) { BeginLDAP(); }
更新到生產環境時,發現生產環境不在同一個域里,因此沒有成功。
但在測試環境中是可以成功實現的。
參考資料:
http://www.cnblogs.com/fish-li/archive/2012/05/07/2486840.html
http://msdn.microsoft.com/zh-cn/library/ms180890
http://msdn.microsoft.com/zh-cn/library/ff647076.aspx