gpt4 book ai didi

c# - 内部不能有带有动态代码的 [Authorize()]

转载 作者:行者123 更新时间:2023-11-30 20:15:16 26 4
gpt4 key购买 nike

我试图让授权接受角色作为枚举或 smart enum这样我就不必调试魔术字符串及其拼写错误

但我一直因为这两个错误而走入死胡同:

  • Attribute constructor parameter 'roles' has type 'Role[]', which is not a valid attribute parameter type

  • An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type

这是我的代码:

AuthorizeRoles.cs

public class AuthorizeRoles : AuthorizeAttribute
{
public AuthorizeRoles(params Role[] roles)
{
string allowed = string.Join(", ", roles.ToList().Select(x => x.Name));
Roles = allowed;
}
}

Role.cs

public class Role
{
public readonly string Name;

public enum MyEnum // added
{
Admin,
Manager
}

public static readonly Role Admin = new Role("Admin");
public static readonly Role Manager = new Role("Manager");

public Role(string name)
{
Name = name;
}

public override string ToString()
{
return Name;
}

在我的 Controller 中我做了这个

    [AuthorizeRoles(Role.Admin, Role.Manager)]
[AuthorizeRoles(Role.MyEnum.Admin)] // added
public IActionResult Index()
{
return Content("hello world");
}

我看过这些答案,但没有用

最佳答案

由于 CLR 约束(属性如何存储在元数据中),属性参数只能是原始类型或这些类型的数组(和 Type s)。你不能传递 Role (自定义对象)到属性。

枚举是有效的,但编译器无法将您的枚举 ( Role.MyEnum ) 转换为 Role ,这是 AuthorizeRoles 的构造函数的类型需要。所以这是一个编译器错误。

如您所料,解决方案是创建一个构造函数,该构造函数接受 Role.MyEnum 的数组。 ,如下所示:

public class AuthorizeRoles : Attribute
{
public string Roles { get; private set; }

public AuthorizeRoles(params Role.MyEnum[] roles)
{
string allowed = string.Join(", ", roles);
Roles = allowed;
}
}

public class Role
{
public readonly string Name;

public enum MyEnum
{
Admin,
Manager
}

public Role(string name)
{
Name = name;
}

public override string ToString()
{
return Name;
}
}

// ...

[AuthorizeRoles(Role.MyEnum.Admin)]
public IActionResult Index()
{
// ...
}

关于c# - 内部不能有带有动态代码的 [Authorize()],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55727211/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com