【问题标题】:Pass an array of enums in C#在 C# 中传递枚举数组
【发布时间】:2019-05-29 11:43:45
【问题描述】:

我需要在 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)

【问题讨论】:

  • 我觉得你需要[Flags]
  • 你知道标志枚举吗?这允许您使用按位或将多个枚举明显地组合成一个枚举。
  • @Sweeper 值得注意的是,除了更改ToString 的输出之外,flags 属性对功能的作用几乎没有。 (哦和Enum.IsDefinedEnum.Parse

标签: c# authorize-attribute


【解决方案1】:

您可以像在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)

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

另外,我建议你不要在你的枚举后面加上 Enum 这个词,并且你的枚举名称使用大写。

【讨论】:

  • 接受@Leonardo 的解决方案,完美运行。谢谢
  • 如果您建议使用 Flags 属性,那么您可能还应该解释它本身几乎什么都不做,您需要明确地将枚举值设置为 2 的幂。
【解决方案2】:

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

private readonly List<RoleEnum> roleInApplications;

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

【讨论】:

    猜你喜欢
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    相关资源
    最近更新 更多