Передать массив перечислений в C # - PullRequest
3 голосов
/ 29 мая 2019

Мне нужно разрешить нескольким ролям иметь доступ к методу в контроллере в 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 ]

5 голосов
/ 29 мая 2019

Вы можете использовать params, как в public ScopeAuthorizeAttribute(params RoleEnum[] roleInApplication), но на самом деле вы пытаетесь решить проблему неправильно, рассмотрите возможность использования 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 и использования UPPERCASE в качестве имен перечисления.

3 голосов
/ 29 мая 2019

Вы можете создать конструктор param. Я обновляю код, как показано ниже.

private readonly List<RoleEnum> roleInApplications;

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