Кэширование JWKS от провайдера идентификации с использованием управления API Azure для проверки JWT - PullRequest
0 голосов
/ 27 февраля 2019

Приведенный ниже код проверяет токен JWT, загружая JWKS каждый раз, когда он проверяет каждый запрос после this

    <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Error: expired token or invalid token" require-expiration-time="true" require-scheme="Bearer" require-signed-tokens="true">
        <openid-config url="https://IdentityProvider/oidc/.well-known/openid-configuration" />
        <audiences>
            <audience>aud id</audience>
        </audiences>
    </validate-jwt>

Мой вопрос заключается в том, как кэшировать JWKS из приведенной ниже ссылки, чтобы избежатьзагружать его каждый раз и без жесткого кодирования JWKS, поскольку он регулярно вращается.

https://demo.identityserver.io/.well-known/openid-configuration/jwks

https://openid -connect-eu.onelogin.com / oidc/ certs

Буду признателен за любой пример кода и ссылки для кэширования и проверки JWT.

Ниже приведен соответствующий, но не полный пример.

https://docs.microsoft.com/en-us/azure/api-management/api-management-sample-cache-by-key

Обновление

Просто чтобы прояснить ситуацию, я хочу кэшировать содержимое JWKS по ссылкам выше для повышения производительности.

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Служба управления API Azure имеет встроенную поддержку кэширования HTTP-ответов с использованием URL-адреса ресурса в качестве ключа (https://github.com/toddkitta/azure-content/blob/master/articles/api-management/api-management-sample-cache-by-key.md).. Что вы можете сделать, это установить URL-адрес openid-config в качестве операции и контролировать кэширование самостоятельноДругим подходом может быть введение собственной службы кэширования.

0 голосов
/ 27 февраля 2019

APIM не будет загружать конфигурацию open id для каждого запроса.Он загружается, кэшируется и автоматически обновляется периодически, каждый час, если я правильно помню.

0 голосов
/ 27 февраля 2019

Проверьте приведенный ниже образец , указанный здесь , если это поможет!

<policies>
    <inbound>
        <!-- Add your wcf relay address as the base URL below -->
        <set-backend-service base-url="" />
        <!-- verify if there is a relaytoken key stored in cache -->
        <cache-lookup-value key="@("relaytoken")" variable-name="relaytoken" />
        <choose>
            <!-- If there is no key stored in cache -->
            <when condition="@(!context.Variables.ContainsKey("relaytoken"))">
                <set-variable name="resourceUri" value="@(context.Request.Url.ToString())" />
                <!-- Retrieve Shared Access Policy key from  Name Value store -->
                <set-variable name="accessKey" value="{{accessKey}}" />
                <!-- Retrieve Shared Access Policy key name from  Name Value store -->
                <set-variable name="keyName" value="{{accessKeyName}}" />
                <!-- Generate the relaytoken key -->
                <set-variable name="relaytoken" value="@{
                    TimeSpan sinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1);
                    string expiry =  Convert.ToString((int)sinceEpoch.TotalSeconds + 3600);
                    string resourceUri = (string)context.Variables["resourceUri"];
                    string stringToSign = Uri.EscapeDataString (resourceUri) + "\n" + expiry;
                    HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes((string)context.Variables["accessKey"]));
                    string signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));
                    string sasToken = String.Format("SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}",
                    Uri.EscapeDataString(resourceUri), Uri.EscapeDataString(signature), expiry, context.Variables["keyName"]);
                    return sasToken;
                    }" />
                <!-- Store the relaytoken in the cache -->
                <cache-store-value key="relaytoken" value="@((string)context.Variables["relaytoken"])" duration="10" />
            </when>
        </choose>
        <!-- If the operation request uses json format, convert it to XML - Azure Relay expects XML format (based on WCF) -->
        <set-body template="liquid">
            <!-- set your body transformation here -->
        </set-body>
        <!-- Create the ServiceBusAuthorization header using the relaytoken as value -->
        <set-header name="ServiceBusAuthorization" exists-action="override">
            <value>@((string)context.Variables["relaytoken"])</value>
        </set-header>
        <!-- Set the content type to application/xml -->
        <set-header name="Content-Type" exists-action="override">
            <value>application/xml</value>
        </set-header>
        <base />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
    <!-- If the operation responses uses json format, convert it from XML - Azure Relay will return XML format (based on WCF) -->
        <set-body template="liquid">
            <!-- set your body transformation here -->
        </set-body>
        <!-- Set the content type to application/json -->
        <set-header name="Content-Type" exists-action="override">
            <value>application/json</value>
        </set-header>
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>
...