Справка по синтаксису XML при создании политики управления API Azure

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

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


person Achal Sharma    schedule 05.05.2020    source источник


Ответы (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=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 И ТАКЖЕ не содержит 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));
person JLRishe    schedule 05.05.2020