我有以下的策略语法,当与GET请求一起传递时,它只对一个证书有效。
<choose>
<when condition="@(context.Request.Certificate != null && !context.Request.Certificate.Issuer.Contains("CN=itv.mit-xperts.com"))">
<return-response>
<set-status code="403" reason="Invalid client certificate Issuer" />
</return-response>
</when>
</choose>
如果我使用该策略在两个证书之间进行验证,那么它将总是转到403,因为OR语句总是返回真。
<choose>
<when condition="@((context.Request.Certificate != null) && (!context.Request.Certificate.Issuer.Contains("CN=itv.mit-xperts.com") || !context.Request.Certificate.Issuer.Contains("CN=DigiCert Test SHA2 Intermediate CA-1")))">
<return-response>
<set-status code="403" reason="Invalid client certificate Issuer" />
</return-response>
</when>
</choose>
API在没有证书的情况下也能工作,但如果通过了证书,那么 "when "标签可能会或可能不会采取行动。我希望只有当使用任何其他Issuer的证书时,条件才会转到403。Issuer Information根据证书的不同,包含了许多不同的属性,但CN=some-text仍然很常见。
我对 XML 及其语法和功能一无所知。
下面的微软文档可能会有帮助,但我没有找到任何可能有帮助的语法。
https:/docs.microsoft.comen-usazureapi-managementapi-management-policy-expressions。
https:/docs.microsoft.comen-usazureapi-managementapi-management-transformation-policy。
看来你的问题不在于语法,而在于布尔逻辑。
(context.Request.Certificate != null) &&
(
!context.Request.Certificate.Issuer.Contains("CN=itv.mit-xperts.com") ||
!context.Request.Certificate.Issuer.Contains("CN=DigiCert Test SHA2 Intermediate CA-1")
)
任何时候,只要发证者不包含... CN=itv.mit-xperts.com
和任何时候,它不包含 CN=itv.mit-xperts.com
看来你在这里实际想要的是一个AND条件。
(context.Request.Certificate != null) &&
(
!context.Request.Certificate.Issuer.Contains("CN=itv.mit-xperts.com") &&
!context.Request.Certificate.Issuer.Contains("CN=DigiCert Test SHA2 Intermediate CA-1")
)
只有当发行人不包含以下内容时,这才是真的 CN=itv.mit-xperts.com
而且它也不包含 CN=DigiCert Test SHA2 Intermediate CA-1
另外,您似乎可以将NOT移到括号外,将AND改为OR,这样可能更容易理解。
(context.Request.Certificate != null) &&
!(
context.Request.Certificate.Issuer.Contains("CN=itv.mit-xperts.com") ||
context.Request.Certificate.Issuer.Contains("CN=DigiCert Test SHA2 Intermediate CA-1")
)
当发行人不包含以下两种情况时,这将是真实的。CN=itv.mit-xperts.com
或 CN=DigiCert Test SHA2 Intermediate CA-1
看来你也可以用LINQ来实现。
var validIssuers = new []
{
"CN=itv.mit-xperts.com",
"CN=DigiCert Test SHA2 Intermediate CA-1",
};
var issuer = context.Request?.Certificate.Issuer;
return issuer != null && !validIssuers.Any(i => issuer.Contains(i));