在 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)
您可以使用 params
as in public ScopeAuthorizeAttribute(params RoleEnum[] roleInApplication)
but in reality you are trying to solve the issue in the wrong way, consider using 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
和使用大写作为您的枚举名称。
您可以创建构造函数参数。我正在更新代码如下。
private readonly List<RoleEnum> roleInApplications;
public ScopeAuthorizeAttribute(params RoleEnum[] roleInApplications)
{
this.roleInApplications = roleInApplications.toList();
}
我需要在 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)
您可以使用 params
as in public ScopeAuthorizeAttribute(params RoleEnum[] roleInApplication)
but in reality you are trying to solve the issue in the wrong way, consider using 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
和使用大写作为您的枚举名称。
您可以创建构造函数参数。我正在更新代码如下。
private readonly List<RoleEnum> roleInApplications;
public ScopeAuthorizeAttribute(params RoleEnum[] roleInApplications)
{
this.roleInApplications = roleInApplications.toList();
}