在C#

时间:2019-05-29 11:43:45

标签: c# authorize-attribute

在C#Web api的控制器中,我需要允许多个角色访问方法。

我有一个自定义AuthorizeAttribute,它具有一个角色类型的枚举,如何使它能够接受多个枚举,即。可变长度的枚举数组。

这是我为Attribute编写的代码:

private readonly RoleEnum roleInApplication;

public ScopeAuthorizeAttribute(RoleEnum roleInApplication)
{
    this.roleInApplication = roleInApplication;
}

public override void OnAuthorization(HttpActionContext actionContext)
{
    base.OnAuthorization(actionContext);
    .......
    var relatedPermisssionRole = (db call to get the rolename..etc)
    RoleEnum role;
    if (Enum.TryParse(relatedPermisssionRole, out role) && role == roleInApplication)
    {
            // Succeed if the scope array contains the required scope
            return;
     }
  }

    HandleUnauthorizedRequest(actionContext);
}

在控制器中,我像这样使用它:

[ScopeAuthorize(RoleEnum.ADMIN)]
public async Task<IHttpActionResult> Create(MyModel model)

如何允许多个角色?例如。

[ScopeAuthorize(RoleEnum.ADMIN, RoleEnum.USER)]
public async Task<IHttpActionResult> Create(MyModel model)

2 个答案:

答案 0 :(得分:5)

您可以像在public ScopeAuthorizeAttribute(params RoleEnum[] roleInApplication)中那样使用params,但实际上您试图以错误的方式解决该问题,请考虑改用Flags

[FlagsAttribute] 
enum Role
{
  None = 0,
  Admin = 1,
  User = 2,
  SomeOtherRole = 4
}

然后,您可以使用按位或运算符将角色作为一个参数传递:

[ScopeAuthorize(Role.Admin | Role.User)]
public async Task<IHttpActionResult> Create(MyModel model)

但是不要只复制我的代码片段,绝对值得一读Flags esp的文档。 Guidelines for FlagsAttribute and Enum,以确保您正确使用此模式。您必须注意一些注意事项,这些注意事项并非立即显而易见。这将花5分钟。

此外,我建议您不要在枚举后加上Enum一词,并在名称中使用大写字母。

答案 1 :(得分:3)

您可以创建构造函数参数。我正在更新以下代码。

private readonly List<RoleEnum> roleInApplications;

public ScopeAuthorizeAttribute(params RoleEnum[] roleInApplications)
{
    this.roleInApplications = roleInApplications.toList();
}