25

我正在使用UserPrincipal.Current.ToString()域中的方法获取具有有效域的当前登录域用户。但是当我在一个字符串中显示它时,它在 IIS 服务器中托管时给出错误:

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

3 回答 3

37

我有同样的问题。它在我的本地机器上运行良好,但是当将它部署到服务器上的 IIS 时它失败了。最后,我必须更改两件事才能使其正常工作:

  1. 将身份验证更改为“Windows 身份验证”(操作方法

  2. 不要使用当前,而是分两步进行:(来源

PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

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

为了最终获得名称(或任何其他信息),我使用了user.DisplayName.

于 2015-08-04T21:46:37.827 回答
7

在 Windows 7 上的 IIS 7 下运行时,我看到了这个异常。

System.Security.Principal.WindowsIdentity.GetCurrent().Name 返回“IIS APPPOOL\ASP.NET v4.0”。

不是一个真实的用户帐户,这部分解释了正在发生的事情,尽管恕我直言UserPrincipal.Current应该更优雅地处理这种情况。

我认为这是一个错误,并在 Connect 上创建了一个错误:

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

作为一种解决方法,用于System.Security.Principal.WindowsIdentity.GetCurrent()获取 IIS AppPool 的标识。

于 2012-06-13T12:28:28.177 回答
3

这里的问题是该UserPrincipal.Current属性将尝试访问当前线程的上下文。但是,如果没有 ASP.NET 模拟,这意味着该标识将是应用程序池的配置标识。即使使用 ASP.NET 模拟,它也必须以某种方式访问​​ Active Directory,因此需要针对域控制器进行身份验证。如果 IIS 中选择的身份验证方法未提供此功能,则可能会出现类似错误。

根据我的经验,只有“BASIC”身份验证和 100% 正确实施的“KERBEROS”版本才能工作。请记住,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

于 2013-02-18T16:13:01.867 回答