我需要将ASP.NET MVC应用程序中的Controller授权给具有两个角色的用户。 我正在使用像这样的Authorize属性:
[授权(角色="制片人,编辑")]
但是这允许生产者和编辑者到控制器。我只希望允许用户同时拥有这两种角色,而不仅仅是其中之一。
我怎么能得到这个?
答案 0 :(得分:20)
正如问题所述,当单个 Authorize()
调用中给出多个角色时,会应用这些角色,如果用户属于 any 列出的角色将被授予访问权限;像一个逻辑OR
运算符。
或者,要实现逻辑AND
运算符的效果,您可以多次应用Authorize
属性 。例如..
[Authorize(Roles = "Producer")]
[Authorize(Roles = "Editor")]
public ActionResult Details(int id) {
// Only available to users who are Producers AND Editors
}
对于上面的示例,只有属于Producer
和Editor
角色的用户才能访问操作正文。
Rudi在评论中指出,这可以让您创建一些相当复杂的访问规则,而无需实现自定义AuthorizeAttribute
。例如,在下面的代码中,用户可以执行操作,如果它们是:a)Enabled
角色,b)Editor
或Admin
角色。
[Authorize(Roles = "Enabled")]
[Authorize(Roles = "Editor,Admin")]
public ActionResult Details(int id) {
// Only available to users who are Enabled AND either an Admin OR an Editor
}
我不确定哪个版本带来了这个版本,但它至少适用于MVC 4和5。
答案 1 :(得分:9)
您应该自定义AuthorizeAttribute
public class AuthorizeMultipleAttribute : AuthorizeAttribute
{
//Authorize multiple roles
public string MultipleRoles { get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var isAuthorized = base.AuthorizeCore(httpContext);
if (!isAuthorized)
{
return false;
}
//Logic here
//Note: Make a split on MultipleRoles, by ','
//User is in both roles => return true, else return false
}
}
DEMO:
[AuthorizeMultiple(MultipleRoles ="Role1,Role2")]
public class UserController{
}