如何将对文件夹的访问限制为Asp.Net WebForms应用程序中的特定活动目录组?

时间:2018-09-19 20:21:19

标签: c# asp.net active-directory

我有一个使用Active Directory进行身份验证的WebForms应用程序。整个公司应该能够(并且可以)访问该应用程序,但是“ Mgr”文件夹中有几种形式,只能由AD组“ ta_admins”访问。我已经阅读了关于SO的多个线程,但是似乎什么也无法工作。

我在“ Mgr”文件夹中创建了一个Web.config文件,并尝试了以下操作:

<?xml version="1.0"?>
  <configuration>
    <system.web>
      <authorization>
        <allow roles = "ta_admins" />
        <deny users = "*" />
      </authorization>
    </system.web>
  </configuration>

我尝试更改“

  

仅当用户名参数与当前Windows身份中的用户名匹配时,才支持此方法。

我是ta_admins的成员。

这是应用程序Web.config的一部分:

<system.web>
  <authorization>
    <deny users="?" />
  </authorization>
  <authentication mode="Windows" />
  <roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider">
    <providers>
      <clear />
      <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
    </providers>
  </roleManager>
  ..............
</system.web>

aspx页面具有一个网格,其中填充有特定AD组的成员。当我不尝试控制可以访问“ Mgr”文件夹的用户组时,此方法就很好。后面的代码如下(不确定是否需要,但是只是在情况下...):

protected void Page_Load(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();

        dt.Columns.AddRange(new DataColumn[5]
        {
            new DataColumn("givenName", typeof (string)),
            new DataColumn("sn", typeof (string)),
            new DataColumn("mail", typeof (string)),
            new DataColumn("department", typeof (string)),
            new DataColumn("manager", typeof (string))
        });

        using (var context = new PrincipalContext(ContextType.Domain, null))
        {
            using (var group = (GroupPrincipal.FindByIdentity(context, "reps")))
            {
                var users = group.GetMembers(true);
                foreach (UserPrincipal user in users)
                {
                    DirectoryEntry de = user.GetUnderlyingObject() as DirectoryEntry;
                    dt.Rows.Add
                    (
                        Convert.ToString(de.Properties["givenName"].Value),
                        Convert.ToString(de.Properties["sn"].Value),
                        Convert.ToString(de.Properties["mail"].Value),
                        Convert.ToString(de.Properties["department"].Value),
                        Regex.Replace((Convert.ToString(de.Properties["manager"].Value)), @"CN=([^,]*),.*$", "$1")
                    );
                }
                rgAdUsrs.DataSource = dt;
                rgAdUsrs.DataBind();
            }
        }
    }

请让我知道是否需要其他信息。

1 个答案:

答案 0 :(得分:0)

我发现了完成此任务的不同方法。我只得到用户所在的所有组的列表,并以此为基础进行表单访问。

PrincipalSearchResult<Principal> groups = UserPrincipal.Current.GetGroups();

        IEnumerable<string> groupNames = groups.Select(x => x.SamAccountName);

        if (!groupNames.Contains("ta_admins"))
        {
            Response.Redirect("~/AccessDenied.aspx");
        }
    }

然后我禁用了目录浏览文件夹的web.config。