【问题标题】:ASP.NET Active Directory Nested Authorization IssueASP.NET Active Directory 嵌套授权问题
【发布时间】:2010-08-16 17:09:19
【问题描述】:

我正在开发一个内部 ASP.NET 应用程序,该应用程序使用 Active Directory 分发列表来管理有权访问该网站的人员。

但是,由于此分发列表可能同时包含用户和组,我必须开发一个解决方案来检查当前用户是否能够访问此站点(例如,他们可能在一个组中,即此分发列表的一部分)。默认的 Windows 身份验证模式不支持这种层次结构。

我的问题是如何确保此网站中的每个资源都只能由此分发列表中的人访问?我目前正在使用应用于每个页面的自定义属性,该属性检查用户的凭据并在他们不是 DL 成员的情况下重定向到“禁止访问”页面。但是,我认为必须有更好的方法来做到这一点,而不需要我在为此站点创建的每个页面上使用该属性?

感谢任何帮助!

【问题讨论】:

    标签: asp.net active-directory authorization


    【解决方案1】:

    在不更改底层身份验证方案的情况下避免重复的最简单解决方法 - 您可以挂钩到 Session_Start 事件并将身份验证值存储在那里,而不是在每个页面上使用它,然后在您的主人的适当事件上检查此值如果你有一个页面。 (同样,这是最省力的,也是针对您直接问题的答案)

    【讨论】:

    • 你说得对,这是执行我需要的自定义身份验证的一种非常简单的方法。此方法是否还会阻止未经身份验证的用户访问其他非页面资源(例如网站上托管的图像)?
    【解决方案2】:

    更新(评论回复)

    要管理组的权限,请使用以下 xml 块。请注意,这将执行您在对其他答案的评论中提到的内容:这也会阻止图像文件等。

    <authorization>
          <allow roles="domain\group"/>
          <deny users="*"/>
    </authorization>
    

    原创

    最好的方法是坚持原生选项:为什么不使用 Membership Provider? ASP.Net 成员资格提供程序可以为您处理所有这些。您可以使用 web.config 文件轻松指定哪些组可以访问哪些页面/目录。

    查看这些链接以获取有关实施 Active Directory 成员资格提供程序的进一步指导:

    http://msdn.microsoft.com/en-us/library/system.web.security.activedirectorymembershipprovider.aspx http://blogs.msdn.com/b/gduthie/archive/2005/08/17/452905.aspx

    此 XML 显示了如何配置 web.config,一旦您使用了会员资格提供程序,以便它允许/拒绝对文件和文件夹的权限(我从 http://support.microsoft.com/kb/316871 得到这个):

    <configuration>
        <system.web>
            <authentication mode="Forms" >
                <forms loginUrl="login.aspx" name=".ASPNETAUTH" protection="None" path="/" timeout="20" >
                </forms>
            </authentication>
    <!-- This section denies access to all files in this application except for those that you have not explicitly specified by using another setting. -->
            <authorization>
                <deny users="?" /> 
            </authorization>
        </system.web>
    <!-- This section gives the unauthenticated user access to the Default1.aspx page only. It is located in the same folder as this configuration file. -->
            <location path="default1.aspx">
            <system.web>
            <authorization>
                <allow users ="*" />
            </authorization>
            </system.web>
            </location>
    <!-- This section gives the unauthenticated user access to all of the files that are stored in the Subdir1 folder.  -->
            <location path="subdir1">
            <system.web>
            <authorization>
                <allow users ="*" />
            </authorization>
            </system.web>
            </location>
    </configuration>
    

    【讨论】:

    • 感谢您的回复,但该站点将部署到我无法很容易接触到的服务器上(由于 IT 部门的严格控制)。这就是我想让 Active Directory 组处理授权的原因,因为我可以轻松地远程更改组成员的身份。
    • 大卫,我认为这里可能存在一些误解。您的目标和我的帖子完全一致,也许我的演示文稿不够完整......我已经修改(现在正在做)我的示例以展示如何控制组的权限。阅读您的评论后,我意识到它只显示“用户”项目。
    • 我一定完全忽略了您提到的 ActiveDirectoryMembershipProvider!对不起,先生,我不知道有这样的事情存在。如果这可行,那么它将比应用程序/母版页建议更容易!
    【解决方案3】:

    我最终推出了自己的安全类来检查当前登录的 Active Directory 用户是否具有访问权限。

    我在System.DirectoryServices.AccountManagement 命名空间中使用了GroupPrincipal.GetMembers 函数。这种采用布尔值的重载方法可用于递归搜索用户(满足我的组内组问题)。

    安全类是单例,允许的活动目录用户列表存储在单例中,以保持此访问检查的快速。我选择了一个 Singleton 以确保服务器上只有 1 个此列表的副本。我将允许的用户列表存储为SortedDictionary,这大大提高了查找速度。

    当不存在的用户尝试访问该站点时,原始用户查找将返回否定结果。此时,安全类刷新用户列表,将此次刷新的时间戳保存到允许用户列表中。该方法坚持此刷新最多每 10 分钟完成一次,以防止用户对网站进行重击(并保持网站对其他用户的响应)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      相关资源
      最近更新 更多