2012-07-02 2 views
2

인트라넷 응용 프로그램을 구축 중이며 Windows 인증을 사용하고 있습니다. 나는이 설정 및 작업을하고 난 내가 등 표시 이름, 이메일 주소,.net mvc가 Active Directory와 통합되고 데이터 모델을 사용하여 System.DirectoryServices.AccountManagement에 액세스하십시오.

를 검색하기 위해 Active Directory를 쿼리 싶습니다 @ Context.User.Identity.Name

를 통해 현재 사용자의 사용자 이름을 볼 수 있어요

나는 System.DirectoryServices.AccountManagement를 살펴 봤고 기본 예제를 만들었다. 내 응용 프로그램을 통해이 정보를 표시하는 방법에 대한 명확하지 않습니다.

public class searchAD 
{ 

    // Establish Domain Context 
    PrincipalContext domainContext = new PrincipalContext(ContextType.Domain); 

    public searchAD() 
    { 
     // find the user 
     UserPrincipal user = UserPrincipal.FindByIdentity(domainContext, HttpContext.Current.User.Identity.Name); 

     if (user != null) 
     { 
      var userGuid = user.Guid; 
      var DisplayName = user.DisplayName; 
      var GivenName = user.GivenName; 
      var EmailAddress = user.EmailAddress; 
     } 

    } 

} 

을 내가 그렇게 같은 뷰 모델을 만들 필요가 가정하고 다음과 같이

는 내가 지금까지 가지고있다?

public class domainContext 
{ 
    public Nullable<Guid> userGuid { get; set; } 
    public string DisplayName { get; set; } 
    public string GivenName { get; set; } 
    public string EmailAddress { get; set; } 
} 

이 응용 프로그램의 다양한 섹션에서이 정보에 액세스 할 수 있기를 원합니다.

나는이 모든 것을 하나로 묶어주는 어떤 것이 든 누락 된 것처럼 보입니다.

답변

5

Windows ID 부분이 누락되었습니다.

public class AdLookup 
{ 
    public static DomainContext GetUserDetails() 
    { 
     using (PrincipalContext pc = new PrincipalContext(ContextType.Domain)) 
     { 
      IPrincipal principal = HttpContext.Current.User; 
      WindowsIdentity identity = ((WindowsIdentity)principal.Identity); 
      UserPrincipal user = UserPrincipal.FindByIdentity(pc, identity.Name); 

      if (principal != null) 
      { 
       return new DomainContext() { 
        userGuid = user.Guid, 
        DisplayName = user.DisplayName, 
        GivenName = user.GivenName, 
        EmailAddress = user.EmailAddress 
       }; 
      } 
     } 

     return null; 
    } 
} 

가장 좋은 일을 할 응용 프로그램이 다른 모든 컨트롤러에서 상속 'BaseController'라는 클래스를 만드는 것입니다 이내에이 모두에 액세스 할 수 있습니다 또한, 당신이 사용하는 오브젝트 어떤 AD 처분 기억 , 그리고이 코드를 거기에 놓으십시오 (이상적으로 DomainContext라는 속성으로).

은을 ViewData에이 정보를 추가, 당신은 또한 기본 컨트롤러의 메소드를 추가 할 수 있습니다 응용 프로그램을 통해 모두에서이 작업을 사용하려면

protected override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
    base.OnActionExecuted(filterContext); 
    ViewData["BaseController_DomainContext"] = AdLookup.GetUserDetails(); 
} 

그런 다음에서 렌더링 귀하의 의견 중 하나에 액세스 할 수 있습니다 사용하여이 모든 상속 컨트롤러 : 물론

@{ 
    DomainContext domainContext = (DomainContext)ViewData["BaseController_DomainContext"]; 
} 

Welcome back: @domainContext.DisplayName 

당신이 널 (null) 문제로 실행 하겠지만, 당신은 더미 DomainContext의 일종으로 GetUserDetails 방법에 그것을 처리 할 수 ​​있습니다.

이것은 단지 하나의 방법 일뿐입니다. 모든 뷰 모델이 상속하고 뷰에서 직접 액세스 할 수있는 기본 뷰 모델을 만들 수도 있지만이 방법은 뷰에서 직접 액세스 할 수 있습니다. 보기 모델에 어떤 복잡성도 추가하지 마십시오.

+0

이전 코드를 사용해 보았지만 불행히도 작동하지 않았습니다. DisplayName, GivenName 등을 내보기로 전달하는 방법을 명확하게 설명해 주시겠습니까? – Stephen

+0

자세한 내용으로 대답하도록 수정되었습니다. – bittenbytailfly

+0

대단히 감사합니다. 나는 거의 다 왔다고 생각한다. 그냥 HttpContext에 대한 오류가 발생했습니다 - 정적 참조가 아닌 객체에 대한 객체 참조가 필요합니다 ... – Stephen

관련 문제