无法理解为什么当我期望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管理中的策略.