如何将枚举作为字符串参数传递给 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 帖子强调了 nameofToString 之间的区别:What is the difference between MyEnum.Item.ToString() and nameof(MyEnum.Item)?

【讨论】:

.ToString() 给我编译器错误 CS0182。 使用字符串常量会导致注入 Role 类的其他类的错误。在尝试授权后,使用 nameof 在 Postman 中返回此消息:“消息”:“未找到名为“Admin”的 AuthorizationPolicy。”。寻找其他解决方案

以上是关于如何将枚举作为字符串参数传递给 Authorize 属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数组作为参数传递给另一个脚本?

如何将向量作为参数传递给另一个向量?

如何将列名作为参数传递给 dplyr 中的函数?

Delphi:如何将列表作为参数传递给SQL查询?

如何在一个条目中将RGB作为单独的参数传递给函数

将枚举参数传递给 WebApi 方法