现在我像这样装饰一个方法,以允许“成员”访问我的控制器动作

[Authorize(Roles="members")]

如何允许多个角色?例如,下面的不工作,但它显示了我正在尝试做什么(允许“成员”和“管理员”访问):

[Authorize(Roles="members", "admin")] 

当前回答

另一种选择是使用一个单独的授权过滤器,但删除内部报价。

[Authorize(Roles="members,admin")]

其他回答

如果你想使用自定义角色,你可以这样做:

CustomRoles类:

public static class CustomRoles
{
    public const string Administrator = "Administrador";
    public const string User = "Usuario";
}

使用

[Authorize(Roles = CustomRoles.Administrator +","+ CustomRoles.User)]

如果你的角色很少,也许你可以把它们结合起来(为了清晰起见):

public static class CustomRoles
{
     public const string Administrator = "Administrador";
     public const string User = "Usuario";
     public const string AdministratorOrUser = Administrator + "," + User;  
}

使用

[Authorize(Roles = CustomRoles.AdministratorOrUser)]

另一种选择是使用一个单独的授权过滤器,但删除内部报价。

[Authorize(Roles="members,admin")]

我把答案混在一起,提出了这个方法。

首先,我们为角色访问创建一个枚举。

public enum ERoleAccess
{
     [Description("Admin User")]
     Admin = 1,

     [Description("General User")]
     User = 2,

     [Description("Editor User")]
     Editor = 3,
}

其次,我们需要一个用于客户MVC授权的属性过滤器。

public class RolesAttribute:AuthorizeAttribute
{
   public RolesAttribute(params ERoleAccess[] roles)
   {
      Roles = string.Join(",", roles);
   }
}

最后,我们可以在控制器或动作上使用“RolesAttribute”。


[Roles(ERoleAccess.Admin, ERoleAccess.Editor, ERoleAccess.User)]

在这种方法中,我们使用可选字符串值的数量。 (1=管理员,2=用户,…)

它有助于减小令牌大小和比较性能。

[Authorize(Roles="admin")]
[Authorize(Roles="members")]

将在需要AND时工作(由问题询问),而此答案显示OR版本。 详见https://learn.microsoft.com/en-us/aspnet/core/security/authorization/roles?view=aspnetcore-6.0#adding-role-checks

使用AspNetCore 2。X,你必须走不同的路:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class AuthorizeRoleAttribute : AuthorizeAttribute
{
    public AuthorizeRoleAttribute(params YourEnum[] roles)
    {
        Policy = string.Join(",", roles.Select(r => r.GetDescription()));
    }
}

就像这样使用它:

[Authorize(YourEnum.Role1, YourEnum.Role2)]