0
votes

Mettre en cache JWKS à partir du fournisseur d'identité à l'aide de la gestion des API Azure pour valider JWT

Le code ci-dessous valide le jeton JWT en téléchargeant JWKS chaque fois qu'il valide chaque requête suivant 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>

Ma question est de savoir comment mettre en cache le JWKS à partir de l'exemple de lien ci-dessous pour éviter de le télécharger à chaque fois, et sans coder en dur le JWKS, car il est tourné régulièrement.

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

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

Tout exemple de code et liens pour la mise en cache et valider JWT serait apprécié.

Ci-dessous semble pertinent mais pas un exemple complet.

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

Mise à jour

Pour être clair, je souhaite mettre en cache le contenu de JWKS des liens ci-dessus pour améliorer les performances.


3 commentaires

Avez-vous fait référence à github.com/toddkitta/azure-content/blob/master/articles/... ?


thx, jettera un coup d'oeil et vous le fera savoir


L'ancienne interface utilisateur n'est pas disponible. Il s'agit de l'actuel: docs.microsoft. com / fr-gb / azure / api-management /…


3 Réponses :


0
votes

Consultez l'exemple ci-dessous référencé d'ici si cela vous aide!

<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>


1 commentaires

la recherche de cache et le stockage peuvent être pertinents. Je souhaite mettre en cache le contenu de JWKS des liens pour améliorer les performances. Mais je ne trouve pas d'exemple complet pour mon cas.



0
votes

Le service Azure API Management a une prise en charge intégrée de la mise en cache des réponses HTTP en utilisant l'URL de la ressource comme clé ( https://github.com/toddkitta/azure-content/blob/master/articles/api-management/api- management-sample-cache-by-key.md ). Ce que vous pouvez faire est de définir l'url openid-config en tant qu'opération et de contrôler la mise en cache par vous-même. Une autre approche pourrait consister à introduire un propre service de mise en cache.


1 commentaires

La mise en cache de la réponse n'est pas ce que je souhaite pour ce cas. Je souhaite mettre en cache le contenu de JWKS des liens pour améliorer les performances. Mais je ne trouve pas d'exemple complet pour mon cas.



0
votes

APIM ne téléchargera pas la configuration des identifiants ouverts pour chaque demande. Il est téléchargé, mis en cache et automatiquement actualisé périodiquement, toutes les heures si je me souviens bien.


3 commentaires

Avez-vous les liens vers vos informations?


Ce lien openid-connect-eu.onelogin.com/oidc/certs a pas de contrôle de cache qui indique quand il est expiré. Comment invalider le cache dans ce cas lorsque le JWK a changé?


Je ne pense pas que ce soit documenté explicitement. les en-têtes de contrôle du cache ne sont pas respectés, une fois les données extraites utilisées pendant une heure, puis actualisées. Pour faire pivoter les clés, vous devez effectuer une rotation en deux étapes: commencez par ajouter une nouvelle clé, puis supprimez l'ancienne clé lorsque tous les jetons signés par elle ont expiré. Assurez-vous également de ne pas avoir de réclamation "enfant" dans vos jetons, car une seule clé sera utilisée si elle correspond à "enfant"