创建 Azure API 管理策略时的 XML 语法帮助

问题描述 投票:0回答:1

我有以下的策略语法,当与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-howto-mutual-certificates-for-lients#checking-the-issuer-and-subject(检查发行人和主体)

https:/docs.microsoft.comen-usazureapi-managementapi-management-policy-expressions。

https:/docs.microsoft.comen-usazureapi-managementapi-management-transformation-policy。

xml azure azure-api-management azure-policy
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));
© www.soinside.com 2019 - 2024. All rights reserved.