Partager via


Validation de jeton JWT

S’APPLIQUE À : tous les niveaux de Gestion des API

La validate-jwt stratégie applique l’existence et la validité d’un jeton web JSON pris en charge (JWT) fourni par un fournisseur d’identité. Le JWT peut être extrait à partir d’un en-tête HTTP spécifié, extrait à partir d’un paramètre de requête spécifié, ou correspondant à une valeur spécifique.

Remarque

Utilisez la stratégie validate-azure-ad-token pour valider un JWT fourni par Microsoft Entra.

Remarque

Définissez les éléments enfants et de stratégie dans l’ordre fourni dans l’instruction de stratégie. Pour vous aider à configurer cette stratégie, le portail fournit un éditeur guidé basé sur des formulaires. En savoir plus sur comment définir ou modifier des stratégies du service Gestion des API.

Instruction de la stratégie

<validate-jwt
    header-name="name of HTTP header containing the token (alternatively, use query-parameter-name or token-value attribute to specify token)"
    query-parameter-name="name of query parameter used to pass the token (alternative, use header-name or token-value attribute to specify token)"
    token-value="expression returning the token as a string (alternatively, use header-name or query-parameter attribute to specify token)"
    failed-validation-httpcode="HTTP status code to return on failure"
    failed-validation-error-message="error message to return on failure"
    require-expiration-time="true | false"
    require-scheme="scheme"
    require-signed-tokens="true | false"
    clock-skew="allowed clock skew in seconds"
    output-token-variable-name="name of a variable to receive a JWT object representing successfully validated token">
  <openid-config url="full URL of the configuration endpoint, for example, https://login.constoso.com/openid-configuration" validate-connectivity="true | false"/>
  <issuer-signing-keys>
    <key id="kid-claim" certificate-id="mycertificate" n="modulus" e="exponent">Base64 encoded signing key</key>
    <!-- if there are multiple keys, then add additional key elements -->
  </issuer-signing-keys>
  <decryption-keys>
    <key certificate-id="mycertificate">Base64 encoded signing key</key>
    <!-- if there are multiple keys, then add additional key elements -->
  </decryption-keys>
  <audiences>
    <audience>audience string</audience>
    <!-- if there are multiple possible audiences, then add additional audience elements -->
  </audiences>
  <issuers>
    <issuer>issuer string</issuer>
    <!-- if there are multiple possible issuers, then add additional issuer elements -->
  </issuers>
  <required-claims>
    <claim name="name of the claim as it appears in the token" match="all | any" separator="separator character in a multi-valued claim">
      <value>claim value as it is expected to appear in the token</value>
      <!-- if there is more than one allowed value, then add additional value elements -->
    </claim>
    <!-- if there are multiple possible allowed claim, then add additional claim elements -->
  </required-claims>
</validate-jwt>

Attributs

Attribut Descriptif Obligatoire Par défaut
header-name Nom de l’en-tête HTTP contenant le jeton. Les expressions de stratégie sont autorisées. L’un des header-nameou query-parameter-nametoken-value doit être spécifié. N/A
query-parameter-name Nom du paramètre de la requête contenant le jeton. Les expressions de stratégie sont autorisées. L’un des header-nameou query-parameter-nametoken-value doit être spécifié. N/A
token-value Expression retournant une chaîne contenant le jeton. Vous ne devez pas retourner Bearer dans le cadre de la valeur du jeton. Les expressions de stratégie sont autorisées. L’un des header-nameou query-parameter-nametoken-value doit être spécifié. N/A
échec de la validation-httpcode Code d’état HTTP à renvoyer si le JWT n’est pas validé. Les expressions de stratégie sont autorisées. Non 401
échec de la validation-error-message Message d’erreur à renvoyer dans le corps de la réponse HTTP si le JWT n’est pas validé. Les éventuels caractères spéciaux de ce message doivent être correctement placés dans une séquence d’échappement. Les expressions de stratégie sont autorisées. Non Le message d’erreur par défaut dépend du problème de validation, par exemple « JWT absent ».
require-expiration-time Propriété booléenne. Spécifie si une revendication d’expiration est requise dans le jeton. Les expressions de stratégie sont autorisées. Non vrai
require-scheme Le nom du schéma de jeton, par ex. « Support ». Lorsque cet attribut est défini, la stratégie garantit que le schéma spécifié est présent dans la valeur d’en-tête d’autorisation. Les expressions de stratégie sont autorisées. Non N/A
exiger des jetons signés Propriété booléenne. Spécifie si un jeton doit être signé. Les expressions de stratégie sont autorisées. Non vrai
horloge-asymétrie Intervalle de temps. Permet de spécifier l’écart maximal de durée estimée entre les horloges système de l’émetteur du jeton et l’instance de gestion des API. Les expressions de stratégie sont autorisées. Non 0 seconde
output-token-variable-name Chaîne. Nom de la variable de contexte qui recevra la valeur du jeton en tant qu’objet de type Jwt lors de la validation réussie du jeton. Les expressions de stratégie ne sont pas autorisées. Non N/A

Éléments

Élément Descriptif Obligatoire
openid-config Ajoutez un ou plusieurs de ces éléments pour spécifier un point de terminaison de configuration OpenID (url attribut) conforme à partir duquel les clés de signature et l’émetteur peuvent être obtenues.

Si vous le souhaitez, définissez validate-connectivity l’attribut pour false désactiver la vérification de la disponibilité du point de terminaison si l’URL ne peut pas être résolue via le DNS public.

La configuration incluant le jeu de clés web JSON (JWKS) est extraite du point de terminaison toutes les heures et mise en cache. Si le jeton validé fait référence à une clé de validation (à l’aide kid de la revendication) manquante dans la configuration mise en cache ou si la récupération échoue, gestion des API extrait le point de terminaison au plus une fois par 5 min. Ces intervalles sont susceptibles d’être modifiés sans préavis.

La réponse doit être conforme aux spécifications définies à l’URL : https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata.

Pour Microsoft Entra ID utiliser le point de terminaison OpenID Connect metadata configuré dans l’inscription de votre application, par exemple :
- v2 https://login.microsoftonline.com/{tenant-name}/v2.0/.well-known/openid-configuration
- v2 Multilocataire https://login.microsoftonline.com/organizations/v2.0/.well-known/openid-configuration
- v1 https://login.microsoftonline.com/{tenant-name}/.well-known/openid-configuration
- Client locataire (préversion) https://{tenant-name}.ciamlogin.com/{tenant-id}/v2.0/.well-known/openid-configuration

Substitution du nom ou de l’ID de votre locataire d’annuaire, par exemple contoso.onmicrosoft.com, pour {tenant-name}.
Non
issuer-signing-keys Liste des clés de sécurité encodées en Base64, dans key les sous-éléments, utilisées pour valider les jetons signés. Si plusieurs clés de sécurité sont présentes, chacune est tentée jusqu’à ce qu’il n’en reste plus (ce qui entraîne un échec de validation) ou jusqu’à ce que l’une d’elles soit la clé appropriée (utile pour la substitution de jeton).

Si vous le souhaitez, spécifiez une clé à l’aide de l’attribut id pour correspondre à la revendication du kid jeton. Pour valider un jeton signé avec une clé asymétrique, spécifiez éventuellement la clé publique à l’aide d’un certificate-id attribut dont la valeur est définie sur l’identificateur d’un certificat chargé dans Gestion des API, ou la paire module RSA n et exposant e de la clé de signature au format codé en Base64url.
Non
déchiffrement-clés Liste des clés encodées en Base64, dans key les sous-éléments, utilisées pour déchiffrer les jetons. Si plusieurs clés de sécurité sont présentes, chacune est tentée jusqu’à ce qu’il n’en reste plus (ce qui entraîne un échec de validation) ou jusqu’à ce que l’une d’elles soit la clé appropriée.

Pour déchiffrer un jeton chiffré avec une clé asymétrique, spécifiez éventuellement la clé publique à l’aide d’un certificate-id attribut dont la valeur est définie sur l’identificateur d’un certificat chargé dans Gestion des API.
Non
Public Liste des revendications d’audience acceptables, dans audience les sous-éléments, qui peuvent être présentes sur le jeton. Si plusieurs valeurs d’audience sont présentes, chacune est tentée jusqu’à ce que toutes soient épuisées (auquel cas la validation échoue) ou que l’une d’elles réussisse. Au moins une audience doit être spécifiée. Non
Émetteurs Liste des principaux acceptables, dans issuer les sous-éléments, qui ont émis le jeton. Si plusieurs valeurs d’émetteur sont présentes, chacune est tentée jusqu’à ce que toutes soient épuisées (auquel cas la validation échoue) ou que l’une d’elles réussisse. Non
required-claims Une liste de revendications, dans claim les sous-éléments, devrait être présente sur le jeton pour qu’elle soit considérée comme valide. Lorsque plusieurs revendications sont présentes, le jeton doit correspondre aux valeurs de revendication en fonction de la valeur de l’attribut match . Non

attributs de clé

Attribut Descriptif Obligatoire Par défaut
pièce d'identité (Clé de signature de l’émetteur uniquement) Chaîne. Identificateur utilisé pour faire correspondre kid la revendication présentée dans JWT. Si aucune clé ne correspond à la revendication, Gestion des API tente chaque clé spécifiée. En savoir plus sur la kid revendication dans la RFC. Non N/A
certificate-id Identificateur d’une entité de certificat chargée dans Gestion des API, utilisé pour spécifier la clé publique pour vérifier qu’un jeton est signé avec une clé asymétrique. Non N/A
n (Clé de signature de l’émetteur uniquement) Module de la clé publique utilisée pour vérifier l’émetteur d’un jeton signé avec une clé asymétrique. Doit être spécifié avec la valeur de l’exposant e. Les expressions de stratégie ne sont pas autorisées. Non N/A
e (Clé de signature de l’émetteur uniquement) Exposant de la clé publique utilisée pour vérifier l’émetteur d’un jeton signé avec une clé asymétrique. Doit être spécifié avec la valeur du module n. Les expressions de stratégie ne sont pas autorisées. Non N/A

attributs de revendication

Attribut Descriptif Obligatoire Par défaut
allumette L’attribut match de l’élément claim spécifie si chaque valeur de revendication dans la stratégie doit être présente dans le jeton pour que la validation réussisse. Les valeurs possibles sont les suivantes :

- all : chaque valeur de revendication de la stratégie doit être présente dans le jeton pour que la validation réussisse.

- any - au moins une valeur de revendication doit être présente dans le jeton pour que la validation réussisse.
Non tout
séparateur Chaîne. Spécifie un séparateur (par exemple, « , ») à utiliser pour extraire un ensemble de valeurs à partir d’une revendication à valeurs multiples. Non N/A

Utilisation

Notes d’utilisation

  • La validate-jwt stratégie exige que la exp revendication inscrite soit incluse dans le JWT, sauf si require-expiration-time l’attribut est spécifié et défini sur false.
  • La stratégie prend en charge les algorithmes de signature symétriques et asymétriques :
    • Symétrique : les algorithmes de chiffrement suivants sont pris en charge : A128CBC-HS256, A192CBC-HS384, A256CBC-HS512.
      • Si elle est utilisée dans la stratégie, la clé doit être fournie en ligne au sein de la stratégie au format encodé en Base64.
    • Asymétrique : les algorithmes de chiffrement suivants sont pris en charge : PS256, RS256, RS512, ES256.
      • Si elle est utilisée dans la stratégie, la clé peut être fournie soit via un point de terminaison de configuration OpenID, soit en spécifiant l’ID d’un certificat chargé (au format PFX) qui contient la clé publique ou la paire modulo-exposant de la clé publique.
  • Si l’instance Gestion des API est injectée ou intégrée dans un réseau virtuel et openid-config les URL de point de terminaison sont configurées dans la stratégie, définissez l’attribut pour false désactiver la validate-connectivity vérification de la disponibilité des points de terminaison.
  • Vous pouvez utiliser des stratégies de restriction d’accès dans différentes étendues à des fins différentes. Par exemple, vous pouvez sécuriser toute l’API avec l’authentification Microsoft Entra en appliquant la stratégie validate-jwt au niveau de l’API, ou vous pouvez l’appliquer au niveau de l’opération d’API et utiliser claims pour un contrôle plus précis.
  • Lors de l’utilisation d’un en-tête personnalisé (header-name), le schéma requis configuré (require-scheme) est ignoré. Pour utiliser un schéma requis, les JWT doivent être fournis dans l’en-tête Authorization .

Exemples

Validation simple du jeton

<validate-jwt header-name="Authorization" require-scheme="Bearer">
    <issuer-signing-keys>
        <key>{{jwt-signing-key}}</key>  <!-- signing key specified as a named value -->
    </issuer-signing-keys>
    <audiences>
        <audience>@(context.Request.OriginalUrl.Host)</audience>  <!-- audience is set to API Management host name -->
    </audiences>
    <issuers>
        <issuer>http://contoso.com/</issuer>
    </issuers>
</validate-jwt>

Validation de jeton avec certificat RSA

<validate-jwt header-name="Authorization" require-scheme="Bearer">
    <issuer-signing-keys>
        <key certificate-id="my-rsa-cert" />  <!-- signing key specified as certificate ID, enclosed in double-quotes -->
    </issuer-signing-keys>
    <audiences>
        <audience>@(context.Request.OriginalUrl.Host)</audience>  <!-- audience is set to API Management host name -->
    </audiences>
    <issuers>
        <issuer>http://contoso.com/</issuer>
    </issuers>
</validate-jwt>

validation de jeton à locataire unique Microsoft Entra ID

<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
    <openid-config url="https://login.microsoftonline.com/contoso.onmicrosoft.com/.well-known/openid-configuration" />
    <audiences>
        <audience>00001111-aaaa-2222-bbbb-3333cccc4444</audience>
    </audiences>
    <required-claims>
        <claim name="id" match="all">
            <value>insert claim here</value>
        </claim>
    </required-claims>
</validate-jwt>

validation des jetons de locataire client Microsoft Entra ID

<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
	<openid-config url="https://<tenant-name>.ciamlogin.com/<tenant-id>/v2.0/.well-known/openid-configuration" />
	<required-claims>
		<claim name="azp" match="all">
			<value>insert claim here</value>
		</claim>
	</required-claims>
</validate-jwt>

validation de jeton Azure Active Directory B2C

<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
    <openid-config url="https://login.microsoftonline.com/tfp/contoso.onmicrosoft.com/b2c_1_signin/v2.0/.well-known/openid-configuration" />
    <audiences>
        <audience>11112222-bbbb-3333-cccc-4444dddd5555</audience>
    </audiences>
    <required-claims>
        <claim name="id" match="all">
            <value>insert claim here</value>
        </claim>
    </required-claims>
</validate-jwt>

Important

À compter du 1er mai 2025, Azure AD B2C ne sera plus disponible pour les nouveaux clients. Pour plus d’informations, consultez notre FAQ.

Validation du jeton à l'aide de la clé de décryptage

Cet exemple montre comment utiliser la validate-jwt stratégie pour valider un jeton déchiffré à l’aide d’une clé de déchiffrement. La clé est spécifiée à l'aide de l'identifiant d'un certificat téléchargé (au format PFX) qui contient la clé publique.

<validate-jwt header-name="Authorization" require-scheme="Bearer" output-token-variable-name="jwt">
    <issuer-signing-keys>
        <key>{{jwt-signing-key}}</key> <!-- signing key is stored in a named value -->
    </issuer-signing-keys>
    <audiences>
        <audience>@(context.Request.OriginalUrl.Host)</audience>
    </audiences>
    <issuers>
        <issuer>contoso.com</issuer>
    </issuers>
    <required-claims>
        <claim name="group" match="any">
            <value>finance</value>
            <value>logistics</value>
        </claim>
    </required-claims>
    <decryption-keys>
        <key certificate-id="my-certificate-in-api-management" /> <!-- decryption key specified as certificate ID -->
    </decryption-keys>
</validate-jwt>

Autoriser l’accès aux opérations à partir de revendications de jetons

Cet exemple montre comment utiliser la stratégie pour autoriser l’accès aux opérations en fonction de la validate-jwt valeur des revendications de jeton.

<validate-jwt header-name="Authorization" require-scheme="Bearer" output-token-variable-name="jwt">
    <issuer-signing-keys>
        <key>{{jwt-signing-key}}</key> <!-- signing key is stored in a named value -->
    </issuer-signing-keys>
    <audiences>
        <audience>@(context.Request.OriginalUrl.Host)</audience>
    </audiences>
    <issuers>
        <issuer>contoso.com</issuer>
    </issuers>
    <required-claims>
        <claim name="group" match="any">
            <value>finance</value>
            <value>logistics</value>
        </claim>
    </required-claims>
</validate-jwt>
<choose>
    <when condition="@(context.Request.Method == "POST" && !((Jwt)context.Variables["jwt"]).Claims["group"].Contains("finance"))">
        <return-response>
            <set-status code="403" reason="Forbidden" />
        </return-response>
    </when>
</choose>

Pour plus d’informations sur l’utilisation des stratégies, consultez :