c# - ASP.NET MVC Windows Authentiaction 和 DirectoryServices - 获取当前用户的邮件地址引发 InvalidCastException

标签 c# asp.net-mvc windows-authentication directoryservices userprincipal

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

var emailAddress = UserPrincipal.Current.EmailAddress;

抛出:

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

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

编辑:

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

[DirectoryServicesCOMException (0x80072020): An operations error occurred. ] 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(DirectoryEntry entry, String propertyName) +119
System.DirectoryServices.PropertyCollection.get_Item(String propertyName) +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 context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate) +27
System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, IdentityType identityType, String identityValue) +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

我能做什么?

最佳答案

IIS Application Pool Identity 设置为 NetworkService 并使用:

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;
    }
}

关于c# - ASP.NET MVC Windows Authentiaction 和 DirectoryServices - 获取当前用户的邮件地址引发 InvalidCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10846909/

相关文章:

c# - 在 C#.NET 中将 Excel 导入数据库

css - ASP.NET MVC 动态设置 CSS 类以根据路由列出元素

c# - Json.NET 从自动属性初始值设定项获取默认值

c# - 为什么将 OrderBy 添加到 LINQ to EF 查询可以提高其性能?

javascript - Json 字符串转 Google map 标记

asp.net - 如何通过窗口身份验证获取电子邮件地址

asp.net-mvc - Windows 身份验证网站提示 Firefox,但不提示 Internet Explorer

asp.net - 使用 Windows 身份验证对 MVC4 站点上的 HTTP 请求进行 Angular 身份验证

c# - 在 DrawText 中设置 VerticalAlignment

jquery - Visual Studio 2010 中使用 jquery 进行智能感知