无法在 System.DirectoryServices.AccountManagement.GroupPrincipa
本文关键字:AccountManagement GroupPrincipa DirectoryServices System | 更新日期: 2023-09-27 18:37:05
我正在使用域中的方法UserPrincipal.Current.ToString()
来获取具有有效域的当前登录域用户。 但是当我在字符串中显示它时,它在 IIS 服务器中托管时出错:
Unable to cast object of type 'System.DirectoryServices.AccountManagement.GroupPrincipal'
to type 'System.DirectoryServices.AccountManagement.UserPrincipal'.
我遇到了同样的问题。它在我的本地计算机上完美运行,但是当将其部署到服务器上的IIS时,它失败了。最后,我不得不改变两件事才能使其工作:
-
将身份验证更改为"Windows 身份验证"(操作方法)
-
不要使用电流,而是分两步进行:(来源)
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, User.Identity.Name);
为了最终获得名称(或任何其他信息),我使用了user.DisplayName
.
我在Windows 7上的IIS 7下运行时看到了此异常。
System.Security.Principal.WindowsIdentity.GetCurrent().名称返回"IIS 应用池''ASP.NET v4.0"。
这不是一个真实的用户帐户,这部分解释了正在发生的事情,尽管恕我直言,UserPrincipal.Current
应该更优雅地处理这种情况。
我认为这是一个错误,并且在连接上创建了一个错误:
http://connect.microsoft.com/VisualStudio/feedback/details/748790/userprincipal-current-throws-invalidcastexception
解决方法是使用 System.Security.Principal.WindowsIdentity.GetCurrent()
获取 IIS 应用程序池的标识。
这里的问题是 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