【问题标题】:ASP.NET Authorize attribute and Admin user roleASP.NET 授权属性和管理员用户角色
【发布时间】:2011-10-24 05:15:14
【问题描述】:

使用Authorize 属性我可以指定允许访问资源的角色。

[Authorize(Roles="User")]

但是如果我有管理员用户可以访问任何我需要的资源,我也需要指定这个

[Authorize(Roles="User, Administrator")]

但是可能有某种方式我可以说管理员允许去任何地方而不是在 Authorize 属性中指定这个?

所以我的意思是如果代码中的某个地方(在控制器上或在操作上)会是这个[Authorize(Roles="User")],这意味着管理员角色也允许去那里。

或者我可以将它设置为所有授权角色在应用程序启动时如何动态?

有什么想法吗?

更新:

目前我有一个具有授权属性[Authorize(Role="Administrator")] 的管理控制器,并且我在另一个具有[Authorize(Role="User")] 属性的控制器中有一些操作,所以如果我没有找到更好的解决方案,我还需要在那里添加"Administrator"

【问题讨论】:

    标签: asp.net-mvc-3 authorization


    【解决方案1】:

    我认为这对你有用。使用 AuthorizeAttribute 创建您自己的基控制器,然后让您的其他控制器继承您的基类。

    [Authorize(Roles="Admin")]
    public class MyFancyController : Controller
    {
    }
    
    [Authorize(Roles = "TaxPayer")]
    public class WizardController : MyFancyController
    {
    ...
    

    在我看来,这很可怕。

    您有多少个控制器/操作?如果您稍后忘记了这一点,也许您有一个您不希望管理员访问的页面怎么办?

    调试代码会变得更加困难吗?

    【讨论】:

    • 我认为这是一个好点,以防万一我不想在某个地方进行管理员访问。问题已更新
    【解决方案2】:
    [Authorize(Roles = "User, Admin")]
    public class PrestamosController : Controller
    {
        // controller details
    }
    

    【讨论】:

      【解决方案3】:

      您可以创建自定义过滤器并使用它来装饰您的动作或控制器。 这是一个我用过很多次的简单结构:

      public class AuthorizationAttribute : ActionFilterAttribute
      {
          public override void OnActionExecuting(ActionExecutingContext filterContext)
          {
              if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
                  {
                  filterContext.Result = new HttpUnauthorizedResult();
                  return;
              }
      
              var actionName = filterContext.ActionDescriptor.ActionName; 
              var controllerName = filterContext.Controller.GetType().Name;
      
              bool isAuthorized =false;
      
              // Put your logic here !!!!
      
              if (!isAuthorized)  {
                  filterContext.Result = new HttpUnauthorizedResult();        
                  return;
              }
          }
      }
      

      您可以阅读更多here

      【讨论】:

        【解决方案4】:

        这就是我所做的:确保处于“管理员”角色的用户也处于“用户”角色。

        【讨论】:

          【解决方案5】:

          您需要静态角色运行时角色的概念。这是一个简单的例子:

          您的角色列表及其级别:

          • 角色:管理员 |等级:1
          • 角色:编辑 |等级:2
          • 角色:查看者 |等级:3

          用户及其静态角色(静态角色是您分配给用户的角色):

          • 用户:约翰 |角色:管理员
          • 用户:Sam |角色:编辑
          • 用户:彼得 |角色:查看者

          在运行时,您使用静态角色和角色级别生成运行时角色,具有较高角色级别的用户会自动获得较低级别的角色。因此,经过计算,这些用户的运行时角色将是:

          • 用户:约翰 |角色:管理员、编辑、查看者
          • 用户:Sam |角色:编辑、查看者
          • 用户:彼得 |角色:查看者

          然后,您可以简单地使用 [Authorize(Roles="Viewer")],具有更高权限级别的用户(例如 John、Sam)也可以访问它。因为它们在运行时还必须具有查看者角色。

          使用静态角色和运行时角色的要点是静态角色使角色分配更容易。并且运行时角色使资源授权更容易。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-09-03
            • 2017-01-28
            • 2020-05-27
            • 2015-07-31
            • 2020-03-02
            • 2011-01-12
            • 1970-01-01
            相关资源
            最近更新 更多