2009年5月25日 星期一

How To:對 Active Directory 使用表單驗證

利用 Active Directory 來驗證帳號

想利用 Active Directory 來驗證帳號是否正確? 於是上網找相關資料,資料很多,但對於『如何設定路徑來連接到 AD'部份沒有說清楚,讓我花費很多時間,程式完成後,你會發現真簡單。

準備工作:
1. 本段摘錄至〔使用 System.DirectoryServices 搜尋 Active Directory〕一文,若要連接 Active Directory,您可以使用 Global Catalog (GC://) 語法指定路徑,或使用標準 LDAP 路徑 (LDAP://)。使用的語法和路徑視網路環境而定。例如,在使用內部網路時,我決定使用 Global Catalog 語法,因為它可讓我搜尋整個企業網路 (整個 Active Directory 樹系)。我不包括伺服器名稱的路徑,而只指定 "GC://dc=home,   dc=duncanmackenzie,dc=net" (假設我的網域叫作 home.duncanmackenzie.net),它讓 ADSI 連接到指定網域的通用類別伺服器。

2. 利用連到 AD的路徑、使用者名稱(或「網域\使用者名稱」的格式)與密碼來建立 DirectoryEntry物件,其中 連到 AD路徑的語法為: LDAP://你的網域名稱 或 LDAP://AD的SERVER名稱,及其他格式。

   使用『WinNT://』執行 DirectorySearcher中 FindOne指令會出現「提供者不支援搜尋,並且無法搜尋 WinNT://xxx.xxx.xxx」訊息,網路上有人說『只有〔LDAP://〕支援搜尋功能,而〔WinNT://〕不支援搜尋功能』。

3. 透過 DirectoryEntry物件連接到 Active Directory,再透過 DirectorySearcher物件找到指定的帳號。


Active Directory 的 SERVER名稱或電腦名稱為 A1.B2.C3.D4.E5

範例程式:

<%@ Page Language="VB" %>
<%@ Import  Namespace="System.DirectoryServices" %>

<script runat="server">

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim user_name As String
        Dim ent As DirectoryEntry

        ent = New DirectoryEntry("LDAP://A1.B2.C3.D4.E5", TX_User.Text, TX_Passwd.Text)

        Dim dirsearcher As DirectorySearcher
        dirsearcher = New DirectorySearcher(ent)
        dirsearcher.Filter = "(sAMAccountName=" + TX_User.Text + ")"

        dirsearcher.PropertiesToLoad.Add("displayName")

        dirsearcher.SearchScope = SearchScope.Subtree

        Try
            Dim results As SearchResult = dirsearcher.FindOne
            '傳回值之中 Path = "LDAP://A1.B2.C3.D4.E5/CN=王小明,CN=Users,DC=B2,DC=C3,DC=D4,DC=E5"
            '其中第一個CN為 AD上看到的名稱,不是〔顯示名稱〕這欄位值

            If IsNothing(results) Then
                Message_label.Text = "找不到 " + TX_User.Text + " 帳號 或 密碼錯誤。"
                Return
            Else
                '通過 AD驗證,將 AD中〔顯示名稱〕這欄設定給 user_name
                user_name = results.GetDirectoryEntry().Properties("displayName").Value
            End If
        Catch ex As Exception
            Message_label.Text = "錯誤訊息:" + ex.Message
            Return
        End Try

        Message_label.Text = user_name + ",登入成功"
    End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>AD 帳號驗證</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
       使用者名稱:<asp:TextBox ID="TX_User" runat="server"></asp:TextBox><br /><br />
       密碼:<asp:TextBox ID="TX_Passwd" runat="server" Style="position: static" TextMode="Password"></asp:TextBox><br /><br />
      
       <asp:Button ID="Button1" runat="server" Style="position: static" Text="登入" OnClick="Button1_Click" /><br /><br />
      
       <asp:Label ID="Message_label" runat="server" Style="position: static" Text=""></asp:Label>
    </div>
    </form>
</body>
</html>

 參考資料:
01. DirectoryEntry.Path 屬性:依提供者有所不同,列出一些常見的案例。

02. 使用 System.DirectoryServices 搜尋 Active Directory

03. Active Directory:簡介 AD。

04. Windows Server Protocols (WSPP):可找到 AD所有欄位說明文件。

05. 在Win 2000 AD環境中,以批次的方式進行使用者帳號的建立與管理:利用「LDP tool」程式可以知道 AD中每一個屬性的欄位名稱。

06. Ldp Overview:這一個工具的功能就是利用LDAP的協定去查詢LDAP Server。

07. 如何使用 ADO 至 Access 透過 ADSI LDAP 提供者物件:透過 ADO 來存取 LDAP 相容目錄中的物件

08. 目錄服務範例:.NET存取及管理 Active Directory 的範例。

09. AD上帳號的讀取、建立及權限設定

10. 利用DirectoryEntry組件來查看網路 (大陸網站)

11. Querying Microsoft Active Directory Using Microsoft .NET Framework Library

12. Howto: (Almost) Everything In Active Directory via C#

13. Active Directory and LDAP - ASP.NET Forums

14. The LDAP Application Program Interface:RFC 1823。

15. How Do LDAP Attributes Map to Address Book Fields:LDAP attribute mappings to Outlook Address Book

16. The Mozilla LDAP C SDK:包含一組 LDAP 應用程式介面 (API),可建立啟用 LDAP 的用戶端。 下載位址

17. 常見的 LDAP RFC