Validation de jeton JWT
S’APPLIQUE À : Tous les niveaux de Gestion des API
La stratégie validate-jwt
applique l’existence et la validité d’un jeton JWT (JSON Web Token) pris en charge 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
Pour valider un JWT fourni par le service Microsoft Entra, Gestion des API fournit également la stratégie validate-azure-ad-token
.
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" />
<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 | Description | Obligatoire | Default |
---|---|---|---|
header-name | Nom de l’en-tête HTTP contenant le jeton. Les expressions de stratégie sont autorisées. | header-name , query-parameter-name ou token-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. | header-name , query-parameter-name ou token-value doit être spécifié. |
N/A |
token-value | Expression retournant une chaîne contenant le jeton. Vous ne devez pas renvoyer Bearer comme partie de la valeur du jeton. Les expressions de stratégie sont autorisées. |
header-name , query-parameter-name ou token-value doit être spécifié. |
N/A |
failed-validation-httpcode | Code d’état HTTP à renvoyer si le JWT n’est pas validé. Les expressions de stratégie sont autorisées. | Non | 401 |
failed-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 | true |
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 |
require-signed-tokens | Propriété booléenne. Spécifie si un jeton doit être signé. Les expressions de stratégie sont autorisées. | Non | true |
clock-skew | 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 à la validation du jeton. Les expressions de stratégie ne sont pas autorisées. |
Non | N/A |
Éléments
Élément | Description | Obligatoire |
---|---|---|
openid-config | Ajoutez un ou plusieurs de ces éléments pour spécifier une URL de point de terminaison de configuration OpenID conforme à partir de laquelle les clés de signature et l’émetteur peuvent être obtenus. 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 de la revendication kid ) manquante dans la configuration mise en cache ou en cas d’échec de la récupération, la Gestion des API extrait le point de terminaison au plus une fois toutes les 5 minutes. Ces intervalles sont susceptibles d’être modifiés sans préavis. La réponse devrait correspondre aux spécifications définies dans l’URL : https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata . Pour Microsoft Entra ID, utilisez le point de terminaison de métadonnées OpenID Connect configuré dans votre inscription d’application, par exemple : – v2 https://login.microsoftonline.com/{tenant-name}/v2.0/.well-known/openid-configuration – v2 multi-locataire https://login.microsoftonline.com/organizations/v2.0/.well-known/openid-configuration – v1 https://login.microsoftonline.com/{tenant-name}/.well-known/openid-configuration – Locataire client (préversion) https://{tenant-name}.ciamlogin.com/{tenant-id}/v2.0/.well-known/openid-configuration En remplaçant le nom ou l’ID de votre locataire de répertoire, par exemple contoso.onmicrosoft.com , pour {tenant-name} . |
Non |
issuer-signing-keys | Liste de clés de sécurité encodées en base 64, en sous-éléments key , utilisée 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). Spécifiez éventuellement une clé à l’aide de l’attribut id pour correspondre à une revendication kid . Pour valider un jeton signé avec une clé asymétrique, spécifiez éventuellement la clé publique à l’aide d’un attribut certificate-id avec la valeur définie sur l’identificateur d’un certificat chargé sur Gestion des API, ou d’une paire RSA de modulo n et d’exposant e de la clé de signature au format encodé en Base64url. |
Non |
decryption-keys | Liste de clés encodées en base 64, en sous-éléments key , utilisée 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 attribut certificate-id dont la valeur est définie sur l’identificateur d’un certificat chargé sur Gestion des API. |
Non |
audiences | Une liste des revendications d’audience acceptables, en sous-éléments audience , 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 |
issuers | Liste des services principaux acceptables, en sous-éléments issuer , 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, en sous-éléments claim , censées être présentes sur le jeton pour qu’il soit considéré 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 | Description | Obligatoire | Default |
---|---|---|---|
id | (Clé de signature de l’émetteur uniquement) Chaîne. Identificateur utilisé pour faire correspondre la revendication kid présentée dans JWT. |
Non | N/A |
certificate-id | Identificateur d’une entité de certificat chargée sur Gestion des API, utilisé pour spécifier la clé publique permettant de vérifier un jeton 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 modulo n . Les expressions de stratégie ne sont pas autorisées. |
Non | N/A |
attributs de revendication
Attribut | Description | Obligatoire | Default |
---|---|---|---|
match | L’attribut match sur l’élément claim spécifie si toutes les valeurs de revendication de la stratégie doivent être présentes dans le jeton pour que la validation réussisse. Les valeurs possibles sont les suivantes :- all : toutes les valeurs de revendication de la stratégie doivent être présentes 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 | all |
separator | 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 |
Usage
- Sections de la stratégie : inbound
- Étendues de la stratégie : global, espace de travail, produit, API, opération
- Passerelles : classiques, v2, consommation, auto-hébergées, espace de travail
Notes d’utilisation
- La stratégie
validate-jwt
exige que la revendication inscriteexp
soit incluse dans le jeton JWT, sauf si l’attributrequire-expiration-time
est spécifié et a la valeurfalse
. - 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.
- Symétrique – Les algorithmes de chiffrement suivants sont pris en charge : A128CBC-HS256, A192CBC-HS384, A256CBC-HS512.
- Pour configurer la stratégie avec un ou plusieurs points de terminaison de configuration OpenID à utiliser avec une passerelle auto-hébergée, les URL des points de terminaison de configuration OpenID doivent également être accessibles par la passerelle cloud.
- 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 l'intégralité de 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 des opérations de l'API et l'utiliserclaims
pour un contrôle plus granulaire. - 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 jetons JWT doivent être fournis dans l’en-têteAuthorization
.
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 du jeton monolocataire 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 du jeton 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 d’un 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>
Autoriser l’accès aux opérations à partir de revendications de jetons
Cet exemple montre comment utiliser la stratégie validate-jwt
pour autoriser l’accès aux opérations à partir de revendications de jetons.
<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>
Stratégies connexes
Contenu connexe
Pour plus d’informations sur l’utilisation des stratégies, consultez :
- Tutoriel : Transformer et protéger votre API
- Référence de stratégie pour obtenir la liste complète des instructions et des paramètres de stratégie
- Expressions de stratégie
- Définir ou modifier des stratégies
- Réutilisation de configurations de stratégie
- Référentiel d’extrait de stratégie
- Créer des stratégies à l’aide de Microsoft Copilot dans Azure