C# ASP.NET MVC Windows Authentication和DirectoryServices-获取当前用户的邮件地址引发InvalidCastException
我正在使用ASP.NET MVC 4和Windows身份验证。 当我使用VisualStudio时,一切正常,但当我部署我的站点时,会引发异常C# ASP.NET MVC Windows Authentication和DirectoryServices-获取当前用户的邮件地址引发InvalidCastException,c#,asp.net-mvc,windows-authentication,directoryservices,userprincipal,C#,Asp.net Mvc,Windows Authentication,Directoryservices,Userprincipal,我正在使用ASP.NET MVC 4和Windows身份验证。 当我使用VisualStudio时,一切正常,但当我部署我的站点时,会引发异常 var emailAddress = UserPrincipal.Current.EmailAddress; 抛出: 无法强制转换类型为的对象 “System.DirectoryServices.AccountManagement.GroupPrincipal”以键入 'System.DirectoryServices.AccountManagemen
var emailAddress = UserPrincipal.Current.EmailAddress;
抛出:
无法强制转换类型为的对象
“System.DirectoryServices.AccountManagement.GroupPrincipal”以键入
'System.DirectoryServices.AccountManagement.UserPrincipal'
其余的工作正常。用户可以进行身份验证,我可以获取用户名等
编辑:
我在IIS上启用了模拟。
现在我得到了以下异常:
[DirectoryServicesCOMException(0x80072020):操作错误
发生。]System.DirectoryServices.DirectoryEntry.Bind(布尔值)
throwIfFail)+781 System.DirectoryServices.DirectoryEntry.Bind()
+44 System.DirectoryServices.DirectoryEntry.get_AdsObject()+42 System.DirectoryServices.PropertyValueCollection.PopulateList()+29System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry 条目,字符串propertyName)+119
System.DirectoryServices.PropertyCollection.get\u项(字符串 propertyName)+163
System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer() +535649系统.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit() +51 System.DirectoryServices.AccountManagement.PrincipalContext.Initialize() +141 System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx() +42 System.DirectoryServices.AccountManagement.Principal.FindByIdentity with TypeHelper(PrincipalContext 上下文,类型principalType,可空`1 identityType,字符串 identityValue,DateTime refDate)+27
System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext 上下文,类型principalType,IdentityType IdentityType,字符串 识别值)+146
System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext 上下文、标识类型标识类型、字符串标识值)+44
System.DirectoryServices.AccountManagement.UserPrincipal.get_Current() +390 Jericho.MVC.HtmlHelperExtensions.GetUser(HtmlHelper-HtmlHelper)位于 C:\Development\Jericho\Jericho.MVC\HtmlHelperExtensions.cs:48
我能做什么?将IIS应用程序池标识设置为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;
}
}