2

我在自定义 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[];
}

它只检查我的应用程序中使用的角色白名单。问题是,如果用户不是其中一个角色的成员,我会得到PrincipalOperationException一个

if (user.IsMemberOf(adGroup))

行被执行。如果用户不在组中,我希望这会简单地返回 `false。这里出了什么问题?

编辑:顺便说一句 ,如果我调用user.GetAuthorizationGroups()并尝试遍历结果,我会得到一个 COMException - 指定的目录服务属性或值不存在。

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 回答