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

时间:2008-08-28 20:05:20

标签: asp.net forms-authentication

我正在使用ASP.NET Login ControlsForms Authentication获取ASP.NET Web应用程序的成员资格/凭据。

我有两个角色:

  • 用户
  • 管理员

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

  • 每个人(默认,帮助)
  • 匿名(CreateUser,Login,PasswordRecovery)
  • 用户(ChangePassword,DataEntry)
  • 管理员(报告)

扩展ASP.NET HOW DO I Video Series: Membership and Roles中的示例,我将这些页面文件放入此类文件夹中:

Visual Studio Solution Explorer

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

它有效,但对我来说似乎很麻烦,它会产生问题when Login.aspx is not at the root和Login.aspx的ReturnUrl parameter

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

3 个答案:

答案 0 :(得分:1)

我的头脑中有几种解决方案。

  1. 您可以为web.config文件中的每个页面设置限制。这将允许您拥有您希望使用的任何文件夹层次结构。但是,每当您添加其他页面时,都需要使web.config文件保持最新。使文件夹结构确定可访问性的好处在于,当您添加新页面时,您不必考虑它。
  2. 让您的页面继承自定义类(即EveryonePage,UserPage,AdminPage等),并在Page_Load例程中进行角色检查。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

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

你也必须把

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