允许多个角色访问控制器操作

cod*_*tte 258 asp.net-mvc controller roles

现在我装饰一个这样的方法,让"成员"访问我的控制器动作

[Authorize(Roles="members")]
Run Code Online (Sandbox Code Playgroud)

如何允许多个角色?例如,以下内容不起作用,但它显示了我要做的事情(允许"成员"和"管理员"访问):

[Authorize(Roles="members", "admin")] 
Run Code Online (Sandbox Code Playgroud)

小智 565

另一种选择是在发布时使用单个授权过滤器,但删除内部引用.

[Authorize(Roles="members, admin")]
Run Code Online (Sandbox Code Playgroud)

  • 也适用于MVC 5.+1 (5认同)
  • 适用于ASP.NET Core 1.0(MVC 6)和Microsoft.AspNet.Identity v3.* (4认同)
  • 适用于MVC3和MVC4 +1 (3认同)
  • 如果您只有一个需要授权的控制器,这是可以的.如果你有多个,你就是复制那些字符串常量(yuck).我更喜欢具有角色名称的静态类.我的宠物讨厌是重复的字符串......太糟糕了. (3认同)
  • 额外注意:根据 https://learn.microsoft.com/en-us/aspnet/core/security/authorization/roles?view=aspnetcore-6.0#adding-role-checks - 这是“OR”而不是“AND” ` (3认同)
  • 为什么?我花了很长时间才解决这个问题。这可能对其遇到同样问题的其他人有帮助。 (2认同)

Pab*_*aus 119

如果要使用自定义角色,可以执行以下操作:

CustomRoles 类:

public static class CustomRoles
{
    public const string Administrator = "Administrador";
    public const string User = "Usuario";
}
Run Code Online (Sandbox Code Playgroud)

用法

[Authorize(Roles = CustomRoles.Administrator +","+ CustomRoles.User)]
Run Code Online (Sandbox Code Playgroud)

如果您的角色很少,也许您可​​以将它们组合起来(为了清晰起见),如下所示:

public static class CustomRoles
{
     public const string Administrator = "Administrador";
     public const string User = "Usuario";
     public const string AdministratorOrUser = Administrator + "," + User;  
}
Run Code Online (Sandbox Code Playgroud)

用法

[Authorize(Roles = CustomRoles.AdministratorOrUser)]
Run Code Online (Sandbox Code Playgroud)

  • 如果您向不知道CustomRoles背后的人解释,这将是一个很好的答案. (7认同)

Mih*_*üür 78

一种可能的简化是子类AuthorizeAttribute:

public class RolesAttribute : AuthorizeAttribute
{
    public RolesAttribute(params string[] roles)
    {
        Roles = String.Join(",", roles);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

[Roles("members", "admin")]
Run Code Online (Sandbox Code Playgroud)

在语义上它与Jim Schmehil的答案相同.

  • 当你使用常量作为你的值时,这个答案更好:ie [Roles(Constants.Admin,Constants.Owner)] (8认同)
  • 我知道这是一篇旧文章,但让我添加一下。为了使此代码片段正常工作,您必须对“System.Web.Mvc.Controllers”使用“System.Web.Mvc.AuthorizeAttribute”,对“System.Web.Http”使用“System.Web.Http.AuthorizeAttribute”。 ApiController`(RESTful 调用)。 (4认同)
  • 这对我没有用,即使用户没有任何角色,登录用户也可以绕过该属性. (2认同)
  • 这是最好的答案 (2认同)

Ber*_*iro 16

对于MVC4,使用带有我的角色的Enum(UserRoles),我使用自定义AuthorizeAttribute.

在我的控制行动中,我这样做:

[CustomAuthorize(UserRoles.Admin, UserRoles.User)]
public ActionResult ChangePassword()
{
    return View();
}
Run Code Online (Sandbox Code Playgroud)

我使用这样的习惯AuthorizeAttribute:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class CustomAuthorize : AuthorizeAttribute
{
    private string[] UserProfilesRequired { get; set; }

    public CustomAuthorize(params object[] userProfilesRequired)
    {
        if (userProfilesRequired.Any(p => p.GetType().BaseType != typeof(Enum)))
            throw new ArgumentException("userProfilesRequired");

        this.UserProfilesRequired = userProfilesRequired.Select(p => Enum.GetName(p.GetType(), p)).ToArray();
    }

    public override void OnAuthorization(AuthorizationContext context)
    {
        bool authorized = false;

        foreach (var role in this.UserProfilesRequired)
            if (HttpContext.Current.User.IsInRole(role))
            {
                authorized = true;
                break;
            }

        if (!authorized)
        {
            var url = new UrlHelper(context.RequestContext);
            var logonUrl = url.Action("Http", "Error", new { Id = 401, Area = "" });
            context.Result = new RedirectResult(logonUrl);

            return;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是FabricioMartínezTamayo修改过的FNHMVC的一部分https://github.com/fabriciomrtnz/FNHMVC/


Sed*_*t Y 11

您可以在 Startup.cs 中使用授权策略

    services.AddAuthorization(options =>
    {
        options.AddPolicy("admin", policy => policy.RequireRole("SuperAdmin","Admin"));
        options.AddPolicy("teacher", policy => policy.RequireRole("SuperAdmin", "Admin", "Teacher"));
    });
Run Code Online (Sandbox Code Playgroud)

在控制器文件中:

 [Authorize(Policy = "teacher")]
 [HttpGet("stats/{id}")]
 public async Task<IActionResult> getStudentStats(int id)
 { ... }
Run Code Online (Sandbox Code Playgroud)

“教师”政策接受 3 个角色。

  • 是“与”还是“或”? (4认同)