【问题标题】:Authorising role combinations授权角色组合
【发布时间】:2015-04-27 09:48:59
【问题描述】:

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

我目前正在使用标准角色 authorisation(webpages_roles/webpages_usersinroles) 功能在 asp.net mvc4 中管理一个网站。

这在一定程度上可以正常工作,控制器中的操作结果会使用以下标签进行适当的修饰:

[Authorize(Roles = "Admin")]

或多个角色之一可以访问的地方:

[Authorize(Roles = "Admin, Manager")]

我需要做的是授权多个角色,"AND"而不是"OR"的情况。 例如。用户必须同时具有"Manager" 角色和"Finance" 角色才能访问控制器。只有"Manager" 或只有"Finance" 的用户不能同时访问操作结果。

这将如何实现?搜索结果显示人们谈论扩展授权属性,但如果有关于如何做到这一点的具体建议或更直接的东西,在这种情况下它会非常有用!

Spike 的解决方案进行了微小的修改,for each 使用 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;
        }

    }
}

【问题讨论】:

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


    【解决方案1】:

    是的,解决这个问题的最佳方法是扩展 Authorize 属性。

    下面是一个Authorize类的例子,你可以实现“AND”

    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”案例

    【讨论】:

    • 感谢 Spike 的帮助,这是 99% 的完美,我只需要对代码稍作修改。我将编辑原始帖子以突出显示问题和解决方案。
    • 啊,是的,你完全正确,我忘记了角色不是数组而是字符串:D 我的错!很高兴我能帮忙:)
    【解决方案2】:

    我没有尝试过,但应该可以检查两个角色。

    基本上,您可以将一个属性应用于授权控制器,而将另一个属性应用于操作方法。

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

    【讨论】:

    • 感谢您的建议,不幸的是,控制器中的某些 ActionResult 需要父角色,而有些则不需要。很遗憾,这将是一个快速简便的解决方案!
    猜你喜欢
    • 1970-01-01
    • 2014-05-08
    • 2014-10-23
    • 1970-01-01
    • 2010-10-21
    • 2019-05-16
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    相关资源
    最近更新 更多