.NET Core中Authorize Roles使用nameof引用静态常量不生效如何解决?
问题原因
nameof 是C#提供的编译时运算符,作用是提取变量、属性、类型等成员的名称字符串,而非它的实际存储值。
你在代码中写 nameof(SD.ROLE_ADMIN) 时,编译后实际传入 Roles 参数的值是字符串 "ROLE_ADMIN",和你预期的静态属性值 "admin" 完全不符,所以授权校验失败。你直接写死 "admin" 时参数值匹配,功能就可以正常运行。
修复方案
方案1(最简便,推荐)
直接去掉 nameof 修饰符,直接传入静态属性值即可:
[Authorize(Roles = SD.ROLE_ADMIN)] [HttpPost] public async Task<IActionResult> DeleteUserAsync([FromBody] ManagementUserRequestDTO requestDTO) { var responseDTO = await _accountRepository.DeleteUser(requestDTO); if (responseDTO.IsSucceeded) return Ok(responseDTO); return BadRequest(responseDTO); }
该方案的优势是后续调整管理员角色名时,只需要修改SD类中 ROLE_ADMIN 的赋值,所有引用的地方会自动生效,不需要逐个修改。
方案2(适合固定不变的角色定义)
如果角色名不需要在运行时修改,可以将SD类中的 ROLE_ADMIN 改为 const 常量,用法和方案1一致:
public static class SD { // 把可读写的属性改为编译时常量 public const string ROLE_ADMIN = "admin"; }
常量会在编译时直接替换为对应的值,性能略好,也能避免运行时意外修改角色名的风险。
内容的提问来源于stack exchange,提问作者otter otter
相关产品推荐
相关产品推荐

