c# - 在 C# 中传递枚举数组

标签 c# authorize-attribute

我需要在 C# Web api 的 Controller 中允许多个角色访问一个方法。

我有一个自定义的AuthorizeAttribute,它接受角色类型的枚举,我怎样才能让它接受多个枚举,即。可变长度的枚举数组。

这是我为属性编写的代码:

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);
}

在 Controller 中,我这样使用它:

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

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

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

最佳答案

你可以使用 paramspublic Sc​​opeAuthorizeAttribute(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 的文档绝对值得特别是Guidelines for FlagsAttribute and Enum以确保您正确使用此模式。您必须注意一些注意事项,这些注意事项不是很明显。这 5 分钟会很值得。

此外,我建议您不要在您的枚举中添加单词 Enum 的后缀,并在您的枚举名称中使用大写。

关于c# - 在 C# 中传递枚举数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56359839/

相关文章:

c# - 在 Asp.Net MVC 3 中,什么构成 AuthorizeAttribute 的经过身份验证的用户?

c# - 如何在另一个类中获取单例实例

c# - 为什么我的第二个变量值在更新第一个时会发生变化?

java - 存储库搜索中带有对象与参数列表的方法。违反建议零售价?

asp.net-core-webapi - 使用身份服务器 4 和 Asp.net Core API 获得 401 未经授权的有效访问 token

asp.net-mvc - 授权属性生命周期

c# - 在运行时 C# 从不同的命名空间中选择对象?

c# - 形成字符串

c# - 在开发过程中绕过或关闭 [Authorize(Roles ="")]?