如何在ASP.NET Web应用程序上使用表单身份验证最佳地处理基于角色的权限?

How do I best handle role based permissions using Forms Authentication on my ASP.NET web application?

我正在使用ASP.NET登录控件和表单身份验证作为ASP.NET Web应用程序的成员身份/凭证。

我有两个角色:

  • 用户数
  • 管理员

我希望页面可以被四个不同的组查看:

  • 所有人(默认,帮助)
  • 匿名(CreateUser,登录名,PasswordRecovery)
  • 用户(ChangePassword,DataEntry)
  • 管理员(报告)

在"我如何学习视频系列:成员资格和角色"中的示例上进行扩展,我将这些页面文件放入以下文件夹中:

Visual Studio Solution Explorer

而且我使用ASP.NET网站管理工具来设置每个文件夹的访问规则。

它可以工作,但对我来说似乎有点麻烦,当Login.aspx不在根目录中并且使用Login.aspx的ReturnUrl参数时,它会产生问题。

有一个更好的方法吗?我可以在页面级别而不是文件夹级别设置权限吗?


在母版页中,我定义了一个公共属性,用于切换安全检查,默认为true。我还声明了一个字符串;该页面所需的角色的分隔列表。

在我的母版页加载中,请执行以下操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if (_secure)
{
  if (Request.IsAuthenticated)
  {
    if (_role.Length > 0)
    {
      if (PortalSecurity.IsInRoles(_role))
      {
        return;
      }
      else
      {
        accessDenied = true;
      }
    }
    else
    {
      return;
    }
  }
}

//do whatever you wanna do to people who dont have access.. bump to a login page or whatever

你也必须把

位于页面顶部,因此您可以访问母版页的扩展属性


我过去使用的一种解决方案是:

  • 创建一个称为" SecurePage"的基本页面或类似的东西。
  • 将属性" AllowedUserRoles"添加到基础页面,该属性是用户角色List或List的通用列表,其中int是角色ID。
  • 在扩展SecurePage的任何页面的Page_Load事件中,将每个允许的用户角色添加到AllowedUserroles属性。
  • 在基本页面中,重写OnLoad()并检查当前用户是否具有AllowedUserRoles中列出的角色之一。
  • 这样就可以自定义每个页面,而无需在web.config中放入大量内容来控制每个页面。


    几个解决方案浮出水面。

  • 您可以在web.config文件中为每个页面设置限制。这样一来,您便可以拥有想要使用的任何文件夹层次结构。但是,无论何时添加其他页面,都需要使web.config文件保持最新。由文件夹结构确定可访问性的一个很好的部分是,在添加新页面时不必考虑它。
  • 让您的页面继承自定义类(即EveryonePage,UserPage,AdminPage等),然后在Page_Load例程中进行角色检查。

  • 推荐阅读