4

ASP.NET MVC 4 및 Windows 인증을 사용하고 있습니다. VisualStudio를 사용할 때 모든 것이 잘 작동하지만 사이트를 배포 할 때 예외가 발생합니다.ASP.NET MVC Windows 인증 및 DirectoryServices - 현재 사용자의 메일 주소 가져 오기 InvalidCastException을 throw합니다.

var emailAddress = UserPrincipal.Current.EmailAddress; 

예외 :

'System.DirectoryServices.AccountManagement.UserPrincipal'을 입력 할 유형 'System.DirectoryServices.AccountManagement.GroupPrincipal'의 개체를 캐스팅 할 수 없습니다.

나머지는 정상적으로 작동합니다. 사용자 인증 할 수 나는 사용자가 등

EDIT 이름을 얻을 수 있습니다 :

내가 IIS에 가장을 활성화. 지금 나는 다음과 같은 예외가 :

[DirectoryServicesCOMException (0x80072020) : 작업 오류 메시지 가 발생했습니다. ] System.DirectoryServices.DirectoryEntry.Bind (부울 throwIfFail) +781 System.DirectoryServices.DirectoryEntry.Bind() +44 System.DirectoryServices.DirectoryEntry.get_AdsObject() +42 System.DirectoryServices.PropertyValueCollection.PopulateList() +29
System.DirectoryServices.PropertyValueCollection..ctor (하여 DirectoryEntry 항목, 문자열 propertyName 형식) 119
System.DirectoryServices.PropertyCollection.get_Item (문자열 propertyName 형식) 163
System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer() + 535649 System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit() +51 System.Dire ctoryServices.AccountManagement.PrincipalContext.Initialize() 141 System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx() 42 System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper (PrincipalContext 컨텍스트 유형 principalType, Nullable`1 identityType, 문자열 identityValue, 날짜 시간 refDate) +27
System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType (PrincipalContext 컨텍스트 유형 principalType, IdentityType identityType, 문자열 identityValue) 146
System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity (PrincipalContext 컨텍스트 , IdentityType identityType, String ide C에서 ntityValue) +44
System.DirectoryServices.AccountManagement.UserPrincipal.get_Current() 390 Jericho.MVC.HtmlHelperExtensions.GetUser (html 헬퍼 Html 헬퍼) : \ 개발 \ 리고 \ Jericho.MVC \ HtmlHelperExtensions.cs 48

어떻게해야합니까?

답변

7

IIS 응용 프로그램 풀 ID가 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; 
    } 
}