想利用 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