ASP.NET Active Directory嵌套授权问题

时间:2010-08-16 17:09:20

标签: asp.net active-directory authorization

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

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

我的问题是如何确保此网站中的每个资源只能由此分发列表中的人员访问?我目前正在使用自定义属性应用于检查用户凭据的每个页面,如果他们不是DL的成员,则重定向到“无访问权”页面。但是,我认为必须有更好的方法来执行此操作,不要求我在为此站点创建的每个页面上使用该属性?

感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

避免重复而不更改基础身份验证方案的最简单修复 - 您可以挂钩到Session_Start事件并在其中存储身份验证值,并在主服务器的相应事件上检查此值,而不是在每个页面上使用它页面,如果你有一个。 (再次,这是最少的努力和针对你的直接问题的答案)

答案 1 :(得分:1)

更新(对评论的回复)

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

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

<强>原始

最好的方法是坚持原生选项:为什么不使用会员提供商? 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>

答案 2 :(得分:0)

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

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

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

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