2012-07-19 2 views
2

를 던졌습니다 : 내 응용 프로그램에서 사용되는 역할의 화이트리스트에 대한의 Active Directory RoleProvider은 - Principal.IsMemberOf 내가 사용자의 Active Directory RoleProvider에서 다음과 같은 방법을 만들었습니다 PrincipalOperationException

public override string[] GetRolesForUser(string username) 
{ 
    ArrayList results = new ArrayList(); 
    using (var principalContext = new PrincipalContext(
      ContextType.Domain, null, domainContainer)) 
    { 
     var user = UserPrincipal.FindByIdentity(
      principalContext, IdentityType.SamAccountName, username); 
     foreach (string acceptibleGroup in GroupsToInclude) 
     { 
      GroupPrincipal adGroup = GroupPrincipal.FindByIdentity(
       principalContext, acceptibleGroup); 
      if (user.IsMemberOf(adGroup)) 
       results.Add(acceptibleGroup); 
     } 
    } 
    return results.ToArray(typeof(string)) as string[]; 
} 

그것은 단지 확인합니다. 문제는 사용자가 역할 중 하나의 구성원이 아닌 경우

if (user.IsMemberOf(adGroup)) 

라인이 실행될 때, 나는 PrincipalOperationException를 얻을 수 있다는 것입니다. 사용자가 그룹에 속하지 않는다면 단순히 false를 리턴 할 것이라고 기대한다. 여기서 뭐가 잘못 됐어?

편집 : 나는 결과를 통해 루프 user.GetAuthorizationGroups()과 시도를 호출하는 경우 으로 옆으로는, 내가 COMException을 얻을 - 지정한 디렉터리 서비스 특성 또는 값이 존재하지 않습니다.

+0

adGroup이 null이거나 비어 있는지 확인 했습니까? –

+0

그래, 특별히 내가 화이트리스트에 속하지 않는 그룹을 추가했다. 코드는 그룹을 올바르게 찾고 adGroup 변수에 할당하지만 IsMemberOf 메소드가 호출되면 불어납니다. – James

답변

3

Principal.IsMemberOf()user.GetAuthorizationGroups()은 모두 tokenGroups 속성을 사용하여 그룹 구성원 자격을 결정합니다.

속성에 액세스하려면 프로그램을 실행하는 데 사용 된 계정이 Builtin\Windows Authorization Access Group에 추가되어 있는지 확인해야합니다.

자세한 내용은 MSDN KB을 참조하십시오.

1

나는 다음과 같이이 문제를 해결하기 위해 관리해야 :

public override string[] GetRolesForUser(string username) 
{ 
    ArrayList results = new ArrayList(); 

    using (PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, null, domainContainer)) 
     { 
      UserPrincipal user = UserPrincipal.FindByIdentity(principalContext, IdentityType.SamAccountName, username); 
      foreach (string acceptibleGroup in GroupsToInclude) 
      { 
       GroupPrincipal p = GroupPrincipal.FindByIdentity(principalContext, IdentityType.SamAccountName, acceptibleGroup); 
       if (p.GetMembers().Contains(user)) 
        results.Add(acceptibleGroup); 
      } 
     } 

    return results.ToArray(typeof(string)) as string[]; 
} 

그것을 다시 그룹의 모든 구성원을 끌어대로 정확히 효율적이지 않다 그러나. 내 문제에 대한 더 나은 해결책이 있다고 확신하고 누군가가 여기에 게시 할 것입니다!