azure api-management case-当表达式未按预期求值时



无法理解为什么当我期望false时,第二个when的表达式被评估为true

这里是我看到的响应(格式化的消息,以便能够比较两个拇指指纹)

403: invalid client certificate 
`A5958B8D39A945764110E210A19952FA5C9CAC9A` != 
`‎A5958B8D39A945764110E210A19952FA5C9CAC9A`

负责验证的策略部分如下所示:

<inbound>
<base />
<set-variable name="clientCert" value="{{Client-Thumbprint}}" />
<set-variable name="testCert" value="{{Test-Thumbprint}}" />
<choose>
<when condition="@(context.Request.Certificate == null || !context.Request.Certificate.Verify())">
<return-response>
<set-status code="403" reason="certificate is missing or not valid" />
</return-response>
</when>
<when condition='@(
(string)context.Request.Certificate.Thumbprint.ToUpper() != ((string)context.Variables["clientCert"]).ToUpper() && 
(string)context.Request.Certificate.Thumbprint.ToUpper() != ((string)context.Variables["testCert"]).ToUpper()
)'>
<return-response>
<set-status code="403" reason='@( string.Format("invalid client certificate `{0}` != `{1}`",
(string)context.Request.Certificate.Thumbprint.ToUpper(),
((string)context.Variables["clientCert"]).ToUpper() 
)' />
</return-response>
</when>
</choose>
...
</inbound>

我确定请求中的拇指指纹等于clientCert变量的值。

我不是在问如何重写这段代码。

我的问题:第二个when表达式有什么问题-为什么它应该是false时被评估为true?

的一个解决方案可以达到上述要求的遵循;

我的问题:second when表达式有什么问题-为什么它是当它应该是假的时候被求值为真?

您所做的策略似乎是正确的,因为第二个值必须是false,要做到这一点,我们需要在when之前使用otherwise

基于MICROSOFT DOCUMENTATION: -

控制流策略必须至少包含一个元素。 元素是可选的。元素中的条件 按照它们在策略中的出现顺序计算。政策包含在带有条件的第一个元素中的语句属性 等于true将被应用。封闭的政策在元素中,如果存在,将应用于所有的条件属性的元素false .

更多信息请参考博客|Azure: API管理中的策略.

最新更新