如果需要,可以提供更多信息,首先发布在这里!
我目前正在使用标准角色授权(webpages_roles/webpages_usersinroles)
功能管理asp.net mvc4中的网站。
这一点工作得很好,控制器内的动作结果适当地用以下标签进行装饰:
[Authorize(Roles = "Admin")]
或多个角色中的一个可以访问的地方:
[Authorize(Roles = "Admin, Manager")]
我需要做的是授权多个角色,"AND"
而不是"OR"
。
例如。用户必须同时担任"Manager"
角色和"Finance"
角色才能访问控制器。只有"Manager"
或仅"Finance"
但不能同时使用for each
的用户必须无法访问操作结果。
如何实现这一目标?搜索结果显示人们谈论扩展authorize属性,但如果有关于如何做到这一点的具体建议或更直接的事情,在这种情况下它会非常有用!
Spike的解决方案稍作修改,var
使用char
创建IsInRole
数据类型,string
函数需要public class AndAuthorize : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
IPrincipal user = httpContext.User;
try
{
if (Roles != null && Roles.Any())
{
foreach (string r in Roles.Split(','))
{
if (!user.IsInRole(r))
return false;
}
}
return true;
}
catch (Exception ex)
{
return false;
}
}
}
最终代码:
$(document).on("click", ".edit", function() {}
答案 0 :(得分:3)
是的,处理这个问题的最佳方法是扩展Authorize属性。
以下是您可以实现到“AND”
的Authorize类的示例public class AndAuthorize : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
try
{
if (Roles != null && Roles.Any())
{
foreach(var role in Roles){
if(!httpContext.User.IsInRole(role))
return false;
}
}
return true;
}
catch (Exception ex)
{
return false;
}
}
}
现在你只需设置[AndAuthorize(Roles =“Admin,Manager”)],因为扩展了authorize类,你可以访问默认属性(角色和用户)。
然后,您可以将原始授权用于“OR”,将此用于“AND”案例
答案 1 :(得分:1)
我没有尝试,但应该检查两个角色。
基本上,您可以应用一个属性来授权控制器,另一个属性用于操作方法。
[Authorize(Roles = "Manager")] //role1
public class YourController : Controller
{
[Authorize(Roles = "Finance")] //role2
public ActionResult Index()
{
}
}
如果你有不同的组合:
[Authorize(Roles = "role1, role2, role3")]
public class YourController : Controller
{
[Authorize(Roles = "role4, role5, role6")]
public ActionResult Index()
{
}
}