2017-05-15 90 views
0

我正在構建一個應用程序,該應用程序將通過Active Directory對用戶進行身份驗證。沒什麼重要的,不添加或編輯用戶,只是驗證憑據。我發現很多帖子 - 一些使用System.DirectoryServices.AccountManagement(.NET 3.5及以上)或使用LDAP DirectoryEntry ...何時檢測到Active Directory自動檢測

我想弄清楚,如果我必須指定AD服務器的URL?當我測試時,我不需要指定任何東西?

  1. 什麼時候AD服務器自動檢測到?我什麼時候需要指定一個URL?

  2. 是否有打電話給我可以獲取自動檢測到的AD服務器URL?

回答

1

當創建域PrincipalContextDirectoryContext而不指定一個域或路徑,則使用當前上下文。即代碼正在執行的帳戶。如果代碼在不在域中的帳戶下執行,則會引發異常。這適用於在Windows窗體應用程序或服務中運行的天氣。

驗證憑據在域所有你需要做的是:

public bool ValidateCredentials(string username, string password) 
{ 
    using (var principalcontext = new PrincipalContext(ContextType.Domain)) 
    { 
     return principalContext.ValidateCredentials(username, password); 
    } 
} 

然而,這不是原因很多做到這一點的最好辦法。

var currentUser = UserPrincipal.Current; 

這將返回:例如,ValidateCredentials即使用戶無法登錄因過期密碼等。其次,有使用Active Directory單一登錄桌面應用程序更爲簡單的方法返回true當前用戶的主體,不需要重新進行身份驗證,Windows已經這樣做了,因此您已經知道用戶是有效的。

+0

有什麼原因?我不僅想要執行當前用戶,所以UserPrincipal.Current將不起作用。我將允許我的用戶以其他用戶身份登錄。你有什麼建議? –

+1

如何在同一個AD下的差異域?這會工作嗎? PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Domain,otherDomainName); –

+1

@MikeTurner然後,只要當前用戶是域的一部分,就可以在我的答案中使用第一個代碼示例,如果不是,則指定用於身份驗證檢查的域,用戶名和密碼。 – Ashigore