2017-03-02 64 views
0

好吧,我有Active Directory查找工作正常,當用戶進入他們的用戶通行證。現在我正在嘗試修改該代碼以允許單點登錄。我有什麼:C#活動目錄FindByIdentity失敗

  • IIS應用程序池設置爲網絡用戶
  • 匿名身份驗證在IIS關閉
  • web配置設置與和

代碼:

WindowsIdentity userIdentity = WindowsIdentity.GetCurrent(); 
using (PrincipalContext domainContext = new PrincipalContext(ContextType.Domain, "mydomain.com")) 
{ 
this.User = UserPrincipal.FindByIdentity(domainContext, IdentityType.SamAccountName, userIdentity.Name); 

根據不同的上下文更改,FindByIdentity將失敗,並顯示以下錯誤之一:

未知錯誤(0x8000500c)堆棧:在System.DirectoryServices.PropertyValueCollection.PopulateList()

未知的錯誤(0x80005000)堆棧:在System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit()

事情我嘗試包括,以「cn = Users,dc = mydomain,dc = com」和「dc = mydomain,dc = com」的形式將容器名稱添加到上下文查找中,以及包括或不包括ContextOptions.Negotiate將容器集或容器傳遞爲空。

只是不知道下一步該去哪裏。我需要用戶的所有組名,並且我試過用UserPrincipal.Current.GetGroups或其他類似的方法獲取組名,但是它失敗的時候會出現與上面相同的PopulateList()錯誤。

我是否缺少一些簡單的東西?如果我在上下文創建中提供用戶/密碼,它可以正常工作,所以我不確定是否必須創建一個AD用戶才能查詢AD,但這根本不是一個好選擇。

我已閱讀關於此的所有帖子,似乎無法通過它。

回答

0

錯誤0x8000500c表示Active Directory Datatype Cannot be Converted to/from a Native DS Datatype

此問題是由於WindowsIdentity.Name的格式爲DOMAIN\USERNAME而不是有效的SamAccountName

似乎您正試圖爲當前用戶獲取UserPrincipal,如果是這樣,請使用UserPrincipal.Current

+0

所以我改變了它:UserPrincipal user = UserPrincipal.Current;即使Current表示它返回一個UserPrincipal,我也會收到此錯誤:無法將類型爲「System.DirectoryServices.AccountManagement.GroupPrincipal' 的對象強制類型爲」System.DirectoryServices.AccountManagement.UserPrincipal「。堆棧: at System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext上下文,IdentityType identityType,String identityValue) at System.DirectoryServices.AccountManagement.UserPrincipal.get_Current() – JeffR