添加AD驗證(域身份驗證)到現有網站


每個網站幾乎都會有用戶登錄的模塊,登錄就會涉及到身份驗證的過程。通常的做法是在頁面上有個登錄的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM