1

我有一个在 Visual Studio 2010 中使用本机身份验证控件的 .NET Framework 版本 4 开发的 ASP.NET 应用程序。我已经使用 Active Directory 成员资格提供程序连接了该站点。

我的连接字符串如下所示:

connectionString="LDAP://MYDC-004/DC=company,DC=corp,DC=pvt"

这很好用,因为登录页面可以正常工作,并且 AD 中存在的任何用户都可以使用他们的凭据登录。

但是,我只想允许一个特定安全组中的用户能够登录。我知道安全组(称为“GR-DwgDep-Admins”)在 AD 组织单位中的位置,所以我想出了这个修改后的连接字符串:

connectionString="LDAP://MYDC-004/CN=GR-DwgDep-Admins,OU=Groups,OU=Division,DC=company,DC=corp,DC=pvt" />

当我尝试登录时(我肯定在这个组中),我得到的错误是“无法在指定的容器中创建用户对象”。

我的语法不正确吗?还是我在概念上这样做是错误的?我真的更喜欢通过连接字符串设置来执行此操作,因为这样现有的 .NET 登录控件将按原样使用它。

我将非常感谢任何人的任何建议。谢谢!

4

1 回答 1

1

您还需要遍历用户所属的组,并检查它是否与您也想授予访问权限的组匹配。

首先你需要加载用户,然后你需要遍历“memberOf”集合并检查它们是否属于指定的组。

           //Get connectionstring from web.config and initialize directory entry to search for groups user belongs to
            DirectoryEntry de = new DirectoryEntry(ConfigurationManager.ConnectionStrings["ADConnectionString"].ConnectionString);

            //Specify that we want to find the groups
            DirectorySearcher ds = new DirectorySearcher(de, "(objectCategory=group)");

            //Filter by user and specify what data to return
            ds.Filter = String.Format("(&(SAMAccountName={0}))", model.UserName);
            ds.PropertiesToLoad.Add("sAMAccountName");
            ds.PropertiesToLoad.Add("memberOf");

            //Loop though all results
            foreach (SearchResult sr in ds.FindAll())
            {
                //Get the properties available and loop through "memberof"
                DirectoryEntry desr = sr.GetDirectoryEntry();
                ResultPropertyCollection myResultPropColl = sr.Properties;

                //Get a key
                foreach (string myKey in myResultPropColl.PropertyNames)
                {
                    //Check the key that we are using "memberof"
                    if (myKey.ToLower() == "memberof")
                    {
                        //Loop through all items for given key
                        foreach (System.String myCollection in myResultPropColl[myKey])
                        {
                            //Check if we have a match
                            if (myCollection.Contains("Web - Internal Admin"))
                            {
                                //Success                                   

                                de.Dispose();
                                desr.Dispose();
                                //Do something
                            }
                        }
                    }
                }
            }

对于第一行,我从 web.config 获取我的 AD 连接字符串

ConfigurationManager.ConnectionStrings["ADConnectionString"].ConnectionString

网络配置

<add name="ADConnectionString" connectionString="LDAP://ua.local/DC=ua,DC=local" />

然后我得到这些组并按特定的用户名过滤它。然后我指定 sAMAccountName 和 memberOf 的返回值。在此示例中,无需获取 sAMAccountName。

    DirectorySearcher ds = new DirectorySearcher(de, "(objectCategory=group)");

        //Filter by user and specify what data to return
        ds.Filter = String.Format("(&(SAMAccountName={0}))", model.UserName);
        ds.PropertiesToLoad.Add("sAMAccountName");
        ds.PropertiesToLoad.Add("memberOf");

其余的很容易理解。循环遍历结果并检查“memberof”键。找到后,使用“memberof”键并遍历其值并检查它是否与您需要的组匹配。

if (myKey.ToLower() == "memberof")

检查此链接以获取更多信息: 搜索组

于 2013-05-21T20:27:52.517 回答