使用Authorize
属性i可以指定允许访问资源的角色。
[Authorize(Roles="User")]
但是,如果我有管理员用户,允许去任何资源,我需要指定这一个
[Authorize(Roles="User, Administrator")]
但可能有某种方式我可以说管理员允许去任何地方,而不是在授权属性中指定这个?
所以我的意思是,如果代码中的某个地方( on controller或on action )将是[Authorize(Roles="User")]
,则意味着管理员角色也可以去那里。
或者我可以动态地将它设置为所有授权角色应用程序何时启动?
有什么想法吗?
更新:
目前我有一个带有授权属性[Authorize(Role="Administrator")]
的管理员控制器,我在其他一些属性为[Authorize(Role="User")]
的控制器中有一些操作,所以我需要在那里添加"Administrator"
如果我没有找不到更好的解决方案。
答案 0 :(得分:2)
我认为这对你有用。使用AuthorizeAttribute创建自己的基本控制器,然后让其他控制器继承您的基类。
[Authorize(Roles="Admin")]
public class MyFancyController : Controller
{
}
[Authorize(Roles = "TaxPayer")]
public class WizardController : MyFancyController
{
...
您有多少个控制器/操作?如果您稍后忘记这一点怎么办?也许您有一个页面,您不希望管理员访问?
调试代码会变得更难吗?
答案 1 :(得分:2)
[Authorize(Roles = "User, Admin")]
public class PrestamosController : Controller
{
// controller details
}
答案 2 :(得分:1)
您可以创建自定义过滤器并使用它来装饰您的操作或控制器。 这是一个我用过很多的简单结构:
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
答案 3 :(得分:0)
这就是我所做的:确保在" Admin"角色也在"用户"作用。
答案 4 :(得分:0)
您需要静态角色和运行时角色的概念。这是一个简单的例子:
您的角色列表及其级别:
用户及其静态角色(静态角色是您分配给用户的角色):
在运行时,您通过使用静态角色和角色级别生成运行时角色,具有更高级别角色的用户自动获得较低级别的角色。因此,经过计算,这些用户的运行时角色将是:
然后,你可以简单地使用[Authorize(Roles =“Viewer”)],具有更高权限级别的用户(例如John,Sam)也可以访问它。因为它们在运行时也必须具有Viewer角色。
使用静态角色和运行时角色的关键是静态角色使角色分配更容易。运行时角色使资源授权更容易。