以 ActiveDirectoryMembershipProvider 實作 AD 表單驗證...
Use Forms Authentication with Active Directory via ActiveDiretoryMembershipProvider
本篇可參考:How To: Use Forms Authentication with Active Directory in ASP.NET 2.0
繼上篇 網站 Windows 驗證 成功之後,想想如果今天客戶有了 AD,但是使用者電腦不一定登入網域的情況下,進入網站時候想透過 AD 做驗證,那是不是得提供 AD 的表單驗證呢?找了相關的資訊,當然有 AD 的表單驗證,不過多半都是透過 LDAP 的方式,嘗試測試後,還真有點頭大,阿就是沒有成功啦 QQ!不久找到了符合小弟這種不會寫程式,又能滿足需球的方法,就是使用 ActiveDirectoryMembershipProvider...
開發工具環境
- Client: Windows XP + Visual Studio 2008
- Server: Windows Server 2003 R2 with SP1 + AD + IIS 6.0
設計過程簡述
- 建立新的 IIS 網站應用程式
- 在 VS 2008 建立一個網站應用程式,新增一個 Login.aspx 頁面並使用 Login Wizard 控制項以利登入!
- 變更與設定網站應用程式為表單驗證,其中要在 web.config 更改 <authentication> <forms> 與 <authorization> 的值。
- 設定 MembershipProvider (自訂成員資格提供者),變更 web.config 加入新的 <connectionStrings> 與 <membership> 值
- 測試、驗證與佈署
實作
1. 建立 IIS 網站應用程式
- 打開 IIS 管理員
- 在網站按右鍵 >新增 > 網站
- 網站建立精靈 > 輸入網站說明 (ex: AuthAd) > 在IP位址及連接埠設定輸入 TCP 連接埠 (ex: 8080) > 在網站主目錄新增資料夾 (ex: C:\Inetpub\wwwroot\AuthAd) > 網站存取權限勾選執行指令碼 > 點選完成
- 再到剛剛所建立的網站點選右鍵 > 內容 > ASP.NET 頁籤 > ASP.NET 版本選擇 2.0.50727 (只要不是 1.1.4322 即可) > 確定
2. 在 VS 2008 建立網站應用程式
- File > New Project > ASP.NET Web Application > Name : AuthAd > OK
- 在 Solution Explorer 新增一個 Login.aspx 網頁
- 點選 Login.aspx 並切換到 Design 模式
- 從 Toolbox 拖曳 Login 控制項到 Login.aspx 頁面,完成即可看到頁面上有一登入的控制項,完成設計後點選儲存。
- 在這邊小弟因為之前一直測試 LDAP,當時是自建相關的登入對話框,以為在這邊也要自建,結果網站佈署後,怎麼點下去都沒反應,搞笑咧... Orz
3. 設定與變更 Web.config 屬性
- 在 Solution Explorer 點選並打開 Web.config
- 找到 <authentication mode="Windows" /> 標籤,將值替換成 <authentication mode="Forms"> 並加入 </authentication>
- 在 <authentication> 與 </authentication> 間加入下列程式碼,如此當登入預設的 default.aspx 網頁發現沒有驗證就會自動導到 login.aspx 網頁進行登入驗證。 1 <forms name=".ASPXAUTH" loginUrl="login.aspx"
2 defaultUrl="default.aspx" protection="All" timeout="30" path="/"
3 requireSSL="false" slidingExpiration="true"
4 cookieless="UseDeviceProfile" domain=""
5 enableCrossAppRedirects="false">
6 <credentials passwordFormat="SHA1" />
7 </forms>
- 在 </authentication> 後面加上 <authorization> 相關程式碼 1 <authorization>
2 <deny users="?" />
3 <allow users="*" />
4 </authorization>
4. 設定 Membership
- 找到 <connectionStrings/> 並替換成如下程式碼 1 <connectionStrings>
2 <add name="ADConnectionString" connectionString="LDAP://testdomain.test.com/CN=Users,DC=testdomain,DC=test,DC=com" />
3 </connectionStrings>
4
其中 connectionString="LDAP://testdomian.test.com.. 請將 Domain 資訊換成您的 Domain;小弟比較偷懶,就只輸入 AD 伺服器的 IP,後面的 CN 等都省略了!
- 加入 <Membership> 相關程式碼,置放於 </authorization> 標籤之後;並將
connectionUsername 與 connectionPassword 換成自己的網域帳戶資訊,此帳戶可以是網域管理者帳戶,如果覺得網域帳戶太大,可任意挑選或建立一個網域使用者權限的帳戶,做為登入驗證時與 AD 做溝通用;但如果要提供線上新增帳戶功能,則此 connectionUsername 的帳戶要能有新增 AD 帳戶的權限。01 <membership defaultProvider="MyADMembershipProvider">
02 <providers>
03 <add
04 name="MyADMembershipProvider"
05 type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0,
06 Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
07 connectionStringName="ADConnectionString"
08 connectionUsername="testdomain\administrator"
09 connectionPassword="password"/>
10 </providers>
11 </membership>
12
5. 測試、驗證與佈署
完成上述步驟後,便可開始進行測試!
- 為了確認登入驗證是成功的,所以在 default.aspx 的頁面上加了 "登入驗證成功" 的描述!
- 接著點選 Solution Explorer 的專案,按右鍵點選 Build
- Build完之後,右鍵點選專案的 Default.aspx > View in Browser;如果眼尖一點,您會看到網頁會先開啟 default.aspx 的連結然後轉到 login.aspx。
- 輸入帳號密碼,這時您可能會用一般慣用的 Domain\Username 或直接輸入 Username 的方式輸入帳號,結果會發現不管怎麼試都是登入失敗!因為預設情況下,使用者名稱格式是以 "使用者主要名稱 (User Principal Names, UPNs) " 來呈現;這是甚麼格式?就是 angi@testdomain.com.tw 的格式!所以登入時,除了帳號之外還要輸入完整的 UPN 才能登入!
- 輸入完整的 UPN 驗證通過後,就登入成功了!
- 如果要將此網站丟到 IIS 上做測試,則把 VS 2008 專案資料夾下的檔案複製到 wwwroot 下所建立的網站資料夾,然後打開 IE 輸入相對應的主機名稱與 port 就可以測試出同樣的效果了!
恩,使用 ActiveDirectoryMembershipProvider 的 AD 表單驗證機制滿簡單的,而在 How To: Use Forms Authentication with Active Directory in ASP.NET 2.0 還有很多的小撇步可以實作喔!