如何将枚举作为字符串参数传递给 Authorize 属性?
Posted
技术标签:
【中文标题】如何将枚举作为字符串参数传递给 Authorize 属性?【英文标题】:How to pass Enum as string parameter to Authorize attribute? 【发布时间】:2021-11-22 07:38:24 【问题描述】:这是我的第一个 ASP.NET Core 身份验证和授权项目,当我尝试将 Enum 传递给 [Authorize] 属性时出现此错误:
错误 CS1503 参数 1:无法从 'BasicAuthAPI.Entities.Role' 到 '字符串'
这是我的控制器方法,它给出了这个错误:
[Authorize(Role.Admin)]
[HttpGet]
public IActionResult GetAll()
var users = _userService.GetAll();
return Ok(users);
角色枚举:
public enum Role
Admin,
User
用户实体:
public class User
public int Id get; set;
public string FirstName get; set;
public string LastName get; set;
public string Username get; set;
public Role Role get; set;
[JsonIgnore]
public string PasswordHash get; set;
还有我在控制器中提到的_userService:
public class UserService : IUserService
private DataContext _context;
private IJwtUtils _jwtUtils;
private readonly AppSettings _appSettings;
public UserService(
DataContext context,
IJwtUtils jwtUtils,
IOptions<AppSettings> appSettings)
_context = context;
_jwtUtils = jwtUtils;
_appSettings = appSettings.Value;
public AuthenticateResponse Authenticate(AuthenticateRequest model)
var user = _context.Users.SingleOrDefault(x => x.Username == model.Username);
// validate
if (user == null || !BCryptNet.Verify(model.Password, user.PasswordHash))
throw new AppException("Username or password is incorrect");
// authentication successful so generate jwt token
var jwtToken = _jwtUtils.GenerateJwtToken(user);
return new AuthenticateResponse(user, jwtToken);
public IEnumerable<User> GetAll()
return _context.Users;
public User GetById(int id)
var user = _context.Users.Find(id);
if (user == null) throw new KeyNotFoundException("User not found");
return user;
如何将管理员角色传递给 [Authorize] 属性?
【问题讨论】:
您打算将其作为角色传递给授权属性还是作为授权策略名称?当前期望您传递的是授权策略名称。 【参考方案1】:要么使用字符串常量
public static class Role
public static string Admin = "Admin";
public static string User = "User";
或者你可以使用nameof
[Authorize(nameof(Role.Admin))]
【讨论】:
【参考方案2】:您可以拨打.ToString()
[Authorize(Role.Admin.ToString())]
[HttpGet]
public IActionResult GetAll()
var users = _userService.GetAll();
return Ok(users);
查看 Alexander 的 answer,我发现以下 SO 帖子强调了 nameof
和 ToString
之间的区别:What is the difference between MyEnum.Item.ToString() and nameof(MyEnum.Item)?
【讨论】:
.ToString() 给我编译器错误 CS0182。 使用字符串常量会导致注入 Role 类的其他类的错误。在尝试授权后,使用 nameof 在 Postman 中返回此消息:“消息”:“未找到名为“Admin”的 AuthorizationPolicy。”。寻找其他解决方案以上是关于如何将枚举作为字符串参数传递给 Authorize 属性?的主要内容,如果未能解决你的问题,请参考以下文章