为什么授权属性策略参数仅限于常量"编译时"?
因为这个限制不允许使用像下面的例子这样的字符串连接,所以有什么理由限制它。
[Authorize($"{Privilege1},{Privilege2}")]
[HttpPost()]
public async Task<IActionResult> Testpost()
{
return Ok();
}
是的,遗憾的是您不能在常量中使用字符串插值,您必须在Authorize
等属性中使用常量。内插字符串在运行时内插,需要在编译时创建常量。
但是,您可以通过这种方式连接字符串,编译器将能够将其转换为常量:
private const string privilege1 = "Privilege1";
private const string privilege2 = "Privilege2";
[Authorize(privilege1 + "," + privilege2)]
[HttpPost()]
public async Task<IActionResult> Testpost()
{
return Ok();
}
必须在编译时知道属性参数才能将其放入程序集元数据中。这就是属性的工作原理。在您的情况下,${}
表示该值仅在运行时已知。
这与串联无关,您可以安全地在那里拥有"a" + ",b"
,这显然是一个串联,但仍使用编译时已知的字符串值。
尝试创建自己的安全策略或继承AuthorizeAttribute
。在自定义逻辑中,可以引用任何角色(静态或动态(。