ASP.NET Authorize attribute and Admin user role
使用
1 | [Authorize(Roles="User")] |
但是,如果我有允许访问任何资源的管理员用户,我也需要指定此资源
1 | [Authorize(Roles="User, Administrator")] |
但是,也许我可以以某种方式说出管理员允许去任何地方并且不在Authorize属性中指定此方法吗?
所以我的意思是,如果代码中的某个位置(在控制器上或在操作上)是此
还是我可以将其动态设置为所有"授权"角色,应用程序何时启动?
有任何想法吗?
更新:
目前,我有一个具有Authorize属性
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)也可以访问它。因为它们还必须在运行时具有查看者角色。
使用静态角色和运行时角色的要点是,静态角色使角色分配更加容易。并且运行时角色使资源授权更加容易。
我就是这样做的:确保具有"管理员"角色的用户也具有"用户"角色。