XML справка по синтаксису при создании Azure политики управления API - PullRequest
0 голосов
/ 05 мая 2020

У меня есть следующий синтаксис для политики, который работает только для одного сертификата при передаче с запросом 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>

Если я использую политику для проверки между двумя сертификатами, то всегда будет go на 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 работает без сертификата, но если сертификат передан, тогда тег «когда» может или не может предпринять действия. Я хочу, чтобы условие от go до 403 только при использовании сертификата от любого другого эмитента. Информация об эмитенте содержит множество различных атрибутов в соответствии с сертификатом, но CN = some-text остается общим.

Я ничего не знаю о XML и его синтаксисе или функциях.

Следующие документы Microsoft могут помочь, но я не нашел синтаксиса, который может помочь:

https://docs.microsoft.com/en-us/azure/api-management/api-management-howto-mutual-certificates-for-clients#checking -the-эмитент-и-субъект

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

1 Ответ

0 голосов
/ 05 мая 2020

Похоже, ваша проблема не в синтаксисе, а в логических логах c:

(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

Похоже, что на самом деле вам нужно условие И:

(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 AND IT ТАКЖЕ не содержит CN=DigiCert Test SHA2 Intermediate CA-1

В качестве альтернативы, кажется, вы можете переместить НЕ за скобки и изменить И на ИЛИ, что может быть немного проще:

(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));
...