繁体   English   中英

在C#中传递一系列枚举

[英]Pass an array of enums in C#

我需要允许多个角色在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)

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

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

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

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

但是,不要只复制我的代码片段,绝对值得仔细阅读Flags esp的文档。 Guidelines for FlagsAttribute and Enum以确保您正确使用此模式。 您必须注意一些警告,这些警告并不是很明显。 这将花费5分钟。

另外,我建议你从单词后面添加你不要枚举Enum和使用大写为您的枚举名称。

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

private readonly List<RoleEnum> roleInApplications;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM