ASP.NET :: Authentication > Forms Authentication with Active Directory

以 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...

開發工具環境

  1. Client: Windows XP + Visual Studio 2008
  2. Server: Windows Server 2003 R2 with SP1 + AD + IIS 6.0

設計過程簡述

  1. 建立新的 IIS 網站應用程式
  2. 在 VS 2008 建立一個網站應用程式,新增一個 Login.aspx 頁面並使用 Login Wizard 控制項以利登入!
  3. 變更與設定網站應用程式為表單驗證,其中要在 web.config 更改 <authentication> <forms> 與 <authorization> 的值。
  4. 設定 MembershipProvider (自訂成員資格提供者),變更 web.config 加入新的 <connectionStrings> 與 <membership> 值
  5. 測試、驗證與佈署

實作
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
    image
  • 在 Solution Explorer 新增一個 Login.aspx 網頁
    image 
    image
    image
  • 點選 Login.aspx 並切換到 Design 模式
    image
  • 從 Toolbox 拖曳 Login 控制項到 Login.aspx 頁面,完成即可看到頁面上有一登入的控制項,完成設計後點選儲存。
    image
    image
  • 在這邊小弟因為之前一直測試 LDAP,當時是自建相關的登入對話框,以為在這邊也要自建,結果網站佈署後,怎麼點下去都沒反應,搞笑咧... Orz

3. 設定與變更 Web.config 屬性

  • 在 Solution Explorer 點選並打開 Web.config
  • 找到 <authentication mode="Windows" /> 標籤,將值替換成 <authentication mode="Forms"> 並加入 </authentication>
    image
  • 在 <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>

    image
  • 在 </authentication> 後面加上 <authorization> 相關程式碼 
    1 <authorization>  
    2   <deny users="?" />  
    3   <allow users="*" />  
    4 </authorization>

    image

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 等都省略了!
     
    image 
  • 加入 <Membership> 相關程式碼,置放於 </authorization> 標籤之後;並將
    connectionUsernameconnectionPassword 換成自己的網域帳戶資訊,此帳戶可以是網域管理者帳戶,如果覺得網域帳戶太大,可任意挑選或建立一個網域使用者權限的帳戶,做為登入驗證時與 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   

    image

5. 測試、驗證與佈署
完成上述步驟後,便可開始進行測試!

  • 為了確認登入驗證是成功的,所以在 default.aspx 的頁面上加了 "登入驗證成功" 的描述!
  • 接著點選 Solution Explorer 的專案,按右鍵點選 Build
    image
  • Build完之後,右鍵點選專案的 Default.aspx > View in Browser;如果眼尖一點,您會看到網頁會先開啟 default.aspx 的連結然後轉到 login.aspx。
    image
  • 輸入帳號密碼,這時您可能會用一般慣用的 Domain\Username 或直接輸入 Username 的方式輸入帳號,結果會發現不管怎麼試都是登入失敗!因為預設情況下,使用者名稱格式是以 "使用者主要名稱 (User Principal Names, UPNs) " 來呈現;這是甚麼格式?就是 angi@testdomain.com.tw 的格式!所以登入時,除了帳號之外還要輸入完整的 UPN 才能登入!
    image
  • 輸入完整的 UPN 驗證通過後,就登入成功了!
    image
  • 如果要將此網站丟到 IIS 上做測試,則把 VS 2008 專案資料夾下的檔案複製到 wwwroot 下所建立的網站資料夾,然後打開 IE 輸入相對應的主機名稱與 port 就可以測試出同樣的效果了!

恩,使用 ActiveDirectoryMembershipProvider 的 AD 表單驗證機制滿簡單的,而在 How To: Use Forms Authentication with Active Directory in ASP.NET 2.0 還有很多的小撇步可以實作喔!