ASP.NET MVC Windows 身份验证和目录服务 - 获取当前用户的邮件地址会引发 InvalidCastEx

本文关键字:用户 地址 InvalidCastEx Windows MVC NET 身份验证 获取 目录服务 ASP | 更新日期: 2023-09-27 18:36:10

我正在使用 ASP.NET MVC 4和Windows身份验证。当我使用VisualStudio时,一切正常,但是当我部署我的站点时,会抛出异常。

var emailAddress = UserPrincipal.Current.EmailAddress;

抛出:

无法强制转换类型的对象 键入"System.DirectoryServices.AccountManagement.GroupPrincipal" 'System.DirectoryServices.AccountManagement.UserPrincipal'.

其余的都可以正常工作。用户可以进行身份验证,我可以获取用户名等。

编辑:

我在 IIS 上启用了模拟。现在我得到以下异常:

[DirectoryServicesCOMException (0x80072020):操作错误 发生。] System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) +781 System.DirectoryServices.DirectoryEntry.Bind() +44 System.DirectoryServices.DirectoryEntry.get_AdsObject() +42 System.DirectoryServices.PropertyValueCollection.PopulateList() +29
System.DirectoryServices.PropertyValueCollection..ctor(目录条目 条目, 字符串属性名称) +119
System.DirectoryServices.PropertyCollection.get_Item(字符串 属性名称) +163
System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer() +535649 System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit() +51 System.DirectoryServices.AccountManagement.PrincipalContext.Initialize() +141 System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx() +42 System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext 上下文, 类型 principalType, Nullable'1 标识类型, 字符串 identityValue, DateTime refDate) +27
System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext 上下文, 类型 主体类型, 标识类型 标识类型, 字符串 身份值) +146
System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue) +44
System.DirectoryServices.AccountManagement.UserPrincipal.get_Current() +390 Jericho.MVC.HtmlHelperExtensions.GetUser(HtmlHelper htmlHelper) in C:''Development''Jericho''Jericho.MVC''HtmlHelperExtensions.cs:48

我能做什么?

ASP.NET MVC Windows 身份验证和目录服务 - 获取当前用户的邮件地址会引发 InvalidCastEx

IIS 应用程序池标识设置为"网络服务"并使用:

var identityName = HttpContext.Current.User.Identity.Name;
using (HostingEnvironment.Impersonate())
{
    using (var context = new PrincipalContext(ContextType.Domain, "yourDomain", null, ContextOptions.Negotiate | ContextOptions.SecureSocketLayer))
    using (var userPrincipal = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, identityName))
    {
        emailAddress = userPrincipal.EmailAddress;
        lastname = userPrincipal.Surname;
        firstname = userPrincipal.GivenName;
    }
}