授权角色组合

时间:2015-04-27 09:49:00

标签: c# asp.net-mvc-4 asp.net-roles

如果需要,可以提供更多信息,首先发布在这里!

我目前正在使用标准角色授权(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() {}

2 个答案:

答案 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()
    {
    }
}