2012-06-13 128 views
12

我在域名使用方法UserPrincipal.Current.ToString()獲取當前登錄的有效域域用戶。但是當我顯示它在一個字符串,它給錯誤時,託管在IIS服務器:無法投類型的對象System.DirectoryServices.AccountManagement.GroupPrincipal

Unable to cast object of type 'System.DirectoryServices.AccountManagement.GroupPrincipal' 
      to type 'System.DirectoryServices.AccountManagement.UserPrincipal'. 
+1

這有幫助嗎? http://stackoverflow.com/a/10848934/43846 – stuartd

回答

14

我有同樣的問題。它在我的本地機器上完美運行,但是當它部署到服務器上的IIS時,它失敗了。最後,我不得不改變兩兩件事,使其工作:

  1. 更改身份驗證爲「Windows身份驗證」(how-to

  2. 而不是使用電流,分兩步做的:(source

PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

UserPrincipal user = UserPrincipal.FindByIdentity(ctx, User.Identity.Name);

並最終獲得的名稱(或任何其他信息),我用user.DisplayName

+3

,這將引發錯誤,我 的(&(objectCategory =用戶)(objectClass的=用戶)(|(=的UserPrincipalName)(=的distinguishedName)(名=)))搜索過濾器無效。 描述:執行當前Web請求期間發生未處理的異常。請查看堆棧跟蹤以獲取有關該錯誤的更多信息以及源代碼的位置。異常詳細信息:System.ArgumentException:(&(objectCategory = user)(objectClass = user)(|(userPrincipalName =)(distinguishedName =)(name =)))搜索過濾器無效 – Kurkula

5

在Windows 7

System.Security.Principal IIS 7下運行,當我看到這個異常.WindowsIdentity.GetCurrent()。Name返回「IIS APPPOOL \ ASP.NET v4.0」。

這是not a real user account,這部分解釋發生了什麼,但恕我直言UserPrincipal.Current應該更加妥善地處理這種情況。

我認爲這是一個錯誤,並已創建了連接錯誤:

http://connect.microsoft.com/VisualStudio/feedback/details/748790/userprincipal-current-throws-invalidcastexception

作爲一種變通方法,使用System.Security.Principal.WindowsIdentity.GetCurrent()得到一個IIS應用程序池的身份。

2

的這裏的問題是,UserPrincipal.Current屬性將嘗試訪問當前線程的上下文。但是,如果沒有ASP.NET模擬,這意味着身份將是應用程序池的配置標識。即使使用ASP.NET模擬,它也必須以某種方式訪問​​Active Directory,因此需要根據域控制器進行身份驗證。如果IIS中選定的身份驗證方法沒有提供該方法,則可能會出現類似的錯誤。

在我的經驗中,只有「BASIC」認證和「KERBEROS」的100%正確實施的版本會工作。請記住,Kerberos與應用程序池和SPN的處理方式並不完全兼容,並且可能會失敗。 NTLM - 這是IIS中Windows身份驗證的回退 - 將不起作用,因爲服務器上缺少密碼。

對HTTP/Kerberos的問題很好看的是:http://blogs.msdn.com/b/friis/archive/2009/12/31/things-to-check-when-kerberos-authentication-fails-using-iis-ie.aspx

相關問題