我有一个使用Windows身份验证和实现自己的RoleProvider的ASP.NET 3.5应用程序。
问题是,我们想将对一组页面的访问限制在几千个用户之内,而不是一个一个地输入它们,我们发现它们属于一个AD组。
答案很简单,如果我们正在检查成员身份的常见组是它的直接成员,则问题就解决了,但我遇到的问题是,如果该组是其他组的成员,然后随后成为另一组的成员,则我的代码总是返回false。
例如:假设我们想检查用户是否是组E的成员,但是用户不是*E*的直接成员,她是“A”的成员,后者是“B”的成员,后者确实是E的成员,因此用户是*E*的成员
我们拥有的其中一种解决方案非常慢,尽管它可以给出正确的答案。
问题是,我们想将对一组页面的访问限制在几千个用户之内,而不是一个一个地输入它们,我们发现它们属于一个AD组。
答案很简单,如果我们正在检查成员身份的常见组是它的直接成员,则问题就解决了,但我遇到的问题是,如果该组是其他组的成员,然后随后成为另一组的成员,则我的代码总是返回false。
例如:假设我们想检查用户是否是组E的成员,但是用户不是*E*的直接成员,她是“A”的成员,后者是“B”的成员,后者确实是E的成员,因此用户是*E*的成员
我们拥有的其中一种解决方案非常慢,尽管它可以给出正确的答案。
using (var context = new PrincipalContext(ContextType.Domain))
{
using (var group = GroupPrincipal.FindByIdentity(context, IdentityType.Name, "DL-COOL-USERS"))
{
var users = group.GetMembers(true); // recursively enumerate
return users.Any(a => a.Name == "userName");
}
}
使用.NET 3.5 System.DirectoryServices.AccountManagement的原始解决方案是我试图让它工作的,当用户直接成为目标组的成员时,它确实可以工作,如下所示:
public bool IsUserInGroup(string userName, string groupName)
{
var cxt = new PrincipalContext(ContextType.Domain, "DOMAIN");
var user = UserPrincipal.FindByIdentity(cxt, IdentityType.SamAccountName, userName);
if (user == null)
{
return false;
}
var group = GroupPrincipal.FindByIdentity(cxt, groupName);
if (group == null)
{
return false;
}
return user.IsMemberOf(group);
}
总之,即使分组嵌套多层,我们仍需要检查成员身份。
非常感谢!