【问题标题】:ASP.NET Identity rolesASP.NET 身份角色
【发布时间】:2016-09-05 03:25:31
【问题描述】:

我正在努力完成以下工作

有多个角色(role1、role2、role3 等),它们都有不同的访问级别。 Role2 可以访问与 role1 相同的内容,但不能访问 role3。

我知道我可以使用控制器中的 authorize 属性来做到这一点,但是有没有其他方式可能更优雅,而不仅仅是属性中的角色列表?

【问题讨论】:

  • 为什么不将角色组合成一个聚合角色并在控制器上使用该角色?您也可以编写自己的AutherizationAttribute,并在该类中定义自己的自定义逻辑。
  • @Igor 自定义属性是个好主意!谢谢:)
  • 另一个建议。如果角色(N)可以访问角色(N-1),那么给用户多个角色。例如角色 3 中的用户也可以在角色 2 和角色 1 中。这样,您无需在 Authorize 属性中添加角色列表,而是拥有 1 个角色,等于访问级别。

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


【解决方案1】:

您可以配置授权策略,这意味着将角色分组到策略中。

ASP.NET Core 示例:

services.AddAuthorization(options =>
            {
                options.AddPolicy("Role1", policy => policy.RequireRole("Role1");
                options.AddPolicy("Role2", policy => policy.RequireRole("Role1", "Role2");
                options.AddPolicy("Role3", policy => policy.RequireRole("Role1", "Role2", "Role3");
            });

并在您的控制器中使用您的策略和授权属性:

[Authorize(Policy = "Role3")]

【讨论】:

    【解决方案2】:

    我已经通过以下方式解决了:

    AuthorizeRoleAttribute.cs

     public class AuthorizeRoleAttribute : AuthorizeAttribute
    {
        public AuthorizeRoleAttribute(string role) : base()
        {
            var result = Enum.Parse(typeof(RolesEnum), role);
            int code = result.GetHashCode();
            List<string> list = new List<string>();
            foreach (var item in Enum.GetValues(typeof(RolesEnum)))
            {
                int tmpCode = item.GetHashCode();
                if (tmpCode >= code)
                {
                    list.Add(item.ToString());
                }
            }
            Roles = string.Join(",", list);
        }
    
    }
    

    角色枚举:

        public enum RolesEnum
    {
        User = 100,
        Supervisor = 200,
        Administration = 300,
        Admin = 400
    }
    

    控制器:

    [AuthorizationRole("主管)] //一些代码

    控制器会通过枚举中的数字自动查找哪些角色对主管具有更多或相等的访问权限。

    【讨论】:

    • 如果您想要额外的安全性,请将该字符串转换为构造函数中的枚举参数。 AuthorizeRoleAttribute(RolesEnum role) : base()。然后你应用它[AuthorizationRole(RolesEnum.Supervisor)]。现在您不必担心拼写错误。
    猜你喜欢
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    相关资源
    最近更新 更多