【问题标题】:Why Authorize Attribute policy parameter are restricted to const?为什么授权属性策略参数仅限于 const?
【发布时间】:2020-06-09 08:43:24
【问题描述】:

为什么 Authorize Attribute 策略参数被限制为 const "compile time" ?

因为这个限制不允许像下面的例子那样使用字符串连接,所以有任何理由限制它。

 [Authorize($"{Privilege1},{Privilege2}")]
 [HttpPost()]
 public async Task<IActionResult> Testpost()
 {
        return Ok();
 }

【问题讨论】:

    标签: asp.net .net asp.net-core .net-framework-version asp.net-apicontroller


    【解决方案1】:

    是的,很遗憾你不能在常量中使用字符串插值,你必须在属性中使用常量,比如Authorize。内插字符串是在运行时内插的,常量需要在编译时创建。

    但是,您可以通过这种方式连接字符串,编译器可以将其变为常量:

     private const string privilege1 = "Privilege1";
     private const string privilege2 = "Privilege2";
    
     [Authorize(privilege1 + "," + privilege2)]
     [HttpPost()]
     public async Task<IActionResult> Testpost()
     {
            return Ok();
     }
    

    【讨论】:

      【解决方案2】:

      必须在编译时知道属性参数才能将其放入程序集元数据中。这就是属性的工作方式。在您的情况下,${} 表示该值仅在运行时已知。

      这与连接无关,您可以安全地使用"a" + ",b",它显然是连接,但仍使用编译时已知的字符串值。

      尝试创建your own security policy or inherit the AuthorizeAttribute。在您的自定义逻辑中,您可以引用任何角色,无论是静态的还是动态的。

      【讨论】:

      • 为了您的快速响应,我理解它更多的是关于运行时值,但为什么我们需要授权属性是编译时间
      • @OsamaAbuSitta:所有属性都相同。如果该属性有一个参数(如您的示例中的权限),它需要是一个常量。属性是 C# 语言的一部分,并且以这种方式工作。常量值将被编译到您的输出程序集(.dll 文件)中。例如,字符串插值可以调用方法,使该值成为非编译时间常数。如果您不想使用该属性,可以在 TestPost() 方法中编写授权逻辑。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      相关资源
      最近更新 更多