0

我有以下策略语法,当与 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 语句始终返回 true:

<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 无需证书即可工作,但如果通过了证书,则“何时”标签可能会或可能不会采取行动。我希望仅在使用具有任何其他颁发者的证书时才使条件变为 403。 根据证书,颁发者信息包含许多不同的属性,但 CN=some-text 仍然很常见。

我对 XML 及其语法或功能一无所知。

以下 Microsoft Docs 可能会有所帮助,但我没有找到任何可能有帮助的语法:

https://docs.microsoft.com/en-us/azure/api-management/api-management-howto-mutual-certificates-for-clients#checking-the-issuer-and-subject

https://docs.microsoft.com/en-us/azure/api-management/api-management-policy-expressions

https://docs.microsoft.com/en-us/azure/api-management/api-management-transformation-policies

4

1 回答 1

0

看来您的问题不在于语法,而在于布尔逻辑:

(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.comCN=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));
于 2020-05-05T18:34:42.223 回答