加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

.net – 如何检查用户是属于AD组还是嵌套组?

发布时间:2020-12-16 03:19:09 所属栏目:asp.Net 来源:网络整理
导读:我有一个使用 Windows身份验证的ASP.NET 3.5应用程序并实现我们自己的RoleProvider. 问题是我们想要将对一组页面的访问限制为几千个用户,而不是逐个输入所有这些页面,我们发现它们属于一个AD组. 答案很简单,如果我们检查特定用户的成员资格的公共组是它的直
我有一个使用 Windows身份验证的ASP.NET 3.5应用程序并实现我们自己的RoleProvider.

问题是我们想要将对一组页面的访问限制为几千个用户,而不是逐个输入所有这些页面,我们发现它们属于一个AD组.

答案很简单,如果我们检查特定用户的成员资格的公共组是它的直接成员,但我遇到的问题是,如果该组是另一个组的成员,然后是另一个组的成员,那么我的代码总是返回false.

例如:假设我们要检查User是否是E组的成员,但是User不是* 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);
}

最重要的是,我们需要检查成员资格,即使这些组嵌套在很多级别中.

非常感谢!

解决方法

解决方案1:使用web.config限制访问

由于您使用的是ASP.NET,因此限制访问的更简单的解决方案是在web.config中设置它,示例如下:

<configuration>
  <location path="protected/url/path">
    <system.web>
      <authorization>
        <allow roles="DOMAINgroup"/>
        <deny users="*"/>
      </authorization>
    </system.web>
  </location>
</configuration>

欲了解更多信息:http://msdn.microsoft.com/en-us/library/wce3kxhd.aspx和http://msdn.microsoft.com/en-us/library/b6x6shw7.aspx.

解决方案2:更快地实现IsUserInGroup

我在.NET 2.0应用程序中使用的代码,在与您的林业相当的大森林中运行良好.

static bool IsUserInGroup(DirectoryEntry user,string groupName)
{
    user.RefreshCache(new string[] {"tokenGroups"});
    for (int i = 0; i < user.Properties["tokenGroups"].Count; i++) {
        SecurityIdentifier sid = new SecurityIdentifier((byte[]) user.Properties["tokenGroups"][i],0);
        try {
            NTuser nt = (NTuser) sid.Translate(typeof(NTuser));
            if (nt.Value.ToLower().EndsWith("" + groupName.ToLower())) {
                return true;
            }
        } catch (IdentityNotMappedException) {
            continue;
        }
    }

    return false;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读