2

I have created the following method in a custom Active Directory RoleProvider:

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

It only checks against a white list of roles which are used in my application. The problem is that if the user is not a member of one of the roles, I get a PrincipalOperationException when the

if (user.IsMemberOf(adGroup))

line is executed. I would expect this to simply return `false if the user is not in the group. What is going wrong here?

EDIT: As and aside, if I call user.GetAuthorizationGroups() and attempt to loop through the results, I get a COMException - The specified directory service attribute or value does not exist.

4

2 に答える 2

3

Principal.IsMemberOf()との両方が属性をuser.GetAuthorizationGroups()使用して、グループ メンバーシップを決定しています。tokenGroups

属性Builtin\Windows Authorization Access Groupにアクセスするには、プログラムの実行に使用したアカウントが追加されていることを確認する必要があります。tokenGroups

詳細については、このMSDN KBを参照してください。

于 2012-07-20T04:26:58.227 に答える
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[]; 
}

ただし、グループのすべてのメンバーを引き戻すため、正確には効率的ではありません。私の問題に対するより良い解決策があると確信しており、誰かがここに投稿してくれることを願っています!

于 2012-07-19T15:22:49.827 に答える