关于授权:ASP.NET Authorize属性和Admin用户角色

ASP.NET Authorize attribute and Admin user role

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

1
[Authorize(Roles="User")]

但是,如果我有允许访问任何资源的管理员用户,我也需要指定此资源

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

但是,也许我可以以某种方式说出管理员允许去任何地方并且不在Authorize属性中指定此方法吗?

所以我的意思是,如果代码中的某个位置(在控制器上或在操作上)是此[Authorize(Roles="User")],则意味着管理员角色也可以进入该位置。

还是我可以将其动态设置为所有"授权"角色,应用程序何时启动?

有任何想法吗?

更新:

目前,我有一个具有Authorize属性[Authorize(Role="Administrator")]的管理控制器,而我在一些具有属性[Authorize(Role="User")]的其他控制器中也有一些操作,因此如果我找不到更好的解决方案,我也需要在其中添加"Administrator"


1
2
3
4
5
[Authorize(Roles ="User, Admin")]
public class PrestamosController : Controller
{
    // controller details
}

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

1
2
3
4
5
6
7
8
9
[Authorize(Roles="Admin")]
public class MyFancyController : Controller
{
}

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

我认为这很可怕。

您有几个控制器/动作?如果您稍后忘记了该信息,并且可能有一个您不希望管理员访问的页面怎么办?

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
        }
    }
}

你可以在这里阅读更多


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

您的角色列表及其级别:

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

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

  • 用户:John |角色:管理员
  • 用户:Sam |角色:编辑
  • 用户:Peter |角色:查看者

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

  • 用户:John |角色:管理员,编辑者,查看者
  • 用户:Sam |角色:编辑器,查看器
  • 用户:Peter |角色:查看者

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

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


我就是这样做的:确保具有"管理员"角色的用户也具有"用户"角色。