代码之家  ›  专栏  ›  技术社区  ›  Zack Peterson

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

  •  3
  • Zack Peterson  · 技术社区  · 17 年前

    我用的是 ASP.NET Login Controls Forms Authentication 用于ASP.NET web应用程序的成员资格/凭据。

    我有两个角色:

    • 用户
    • 管理员

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

    • 所有人 (默认,帮助)
    • 匿名的 (创建用户、登录、密码恢复)
    • 用户 (更改密码,数据项)
    • 管理员 (报告)

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

    Visual Studio Solution Explorer

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

    它很有效,但在我看来很模糊,而且会产生问题 when Login.aspx is not at the root 以及 ReturnUrl parameter 登录.aspx。

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

    3 回复  |  直到 8 年前
        1
  •  1
  •   Kevin Pang    17 年前

    我脑子里有几个解决办法。

    1. 您可以为web.config文件中的每个页面设置限制。这将允许您使用任何文件夹层次结构。但是,无论何时添加其他页面,都需要保持web.config文件是最新的。让文件夹结构决定可访问性的好处是,在添加新页面时不必考虑它。
    2. 让您的页面从自定义类(即everynepage、UserPage、AdminPage等)继承,并在页面加载例程中进行角色检查。
        2
  •  1
  •   JCJC    17 年前

    我以前用过的一个解决方案是:

    1. 创建一个名为“SecurePage”的基页或类似的内容。
    2. 将属性“AllowedUserRoles”添加到基本页,该页是用户角色列表的通用列表,或是int是角色id的列表。
    3. 在任何扩展SecurePage的页面加载事件中,将每个允许的用户角色添加到AllowedUserroles属性。
    4. 在基页override OnLoad()中,检查当前用户是否具有AllowedUserRoles中列出的角色之一。

    这允许自定义每个页面,而不必在web.config中放入大量内容来控制每个页面。

        3
  •  1
  •   dfasdljkhfaskldjhfasklhf    17 年前

    在母版页中,我定义了一个用于切换安全检查的公共属性,默认为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
    

    你还得把

    在页面顶部,以便访问母版页的扩展属性