Azure ad access token signature invalide
Exemples de configuration des configurations de métadonnées OpenId Connect
Ces erreurs de validation de signature se produisent lorsque le fournisseur de ressources (et non Azure AD) n’est pas en mesure de valider la signature du jeton, soit parce que la clé de signature est introuvable, soit parce que la clé de signature utilisée n’a pas pu valider la signature. Cet article décrit les scénarios et les solutions les plus courants. Le concept et la cause profonde sont toujours les mêmes et continueront de s’appliquer. Malheureusement, de nombreux développeurs et fournisseurs mettent en œuvre leur validation de jeton différemment.
Tout d’abord, récupérez le jeton d’accès envoyé au fournisseur de ressources. Nous devons décoder cela pour passer en revue (3) affirmations importantes :
Vous pouvez décoder les jetons d’accès à l’aide de https://jwt.ms
Débarrassons-nous de la plus facile. Si vous envoyez un jeton d’accès Microsoft Graph à un autre fournisseur de ressources qui n’est pas Microsoft graphique, vous obtiendrez une erreur de validation de signature. Seul Microsoft Graph peut valider ces jetons. Vous saurez s’il s’agit d’un jeton Microsoft Graph en jetant un coup d’œil à la revendication « aud » et si sa valeur est l’une des suivantes :
- https://graph.microsoft.us
- https://graph.microsoft.us/ https://graph.microsoft.com
- https://graph.microsoft.com/
- https://dod-graph.microsoft.us
- https://dod-graph.microsoft.us/
- 00000003-0000-0000-c000-0000000000
Assurez-vous que vous acquérez le jeton d’accès correct pour le fournisseur de ressources et que la revendication « aud » correspond à ce que le fournisseur de ressources attend. L’audience des jetons d’accès est déterminée par le paramètre scope qui est envoyé dans la demande lors de l’acquisition des jetons d’accès. Donc, si vous souhaitez obtenir un jeton d’accès pour https://api.contoso.com, alors l’étendue se présente comme suit : https://api.contoso.com/read
Pour plus d’informations sur Azure AD et l’exposition de votre API
https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-configure-app-expose-web-apis#:~:text=Azure%20Add%20Scope%201%20Sign%20in%20to%20the,or%20specify%20your%20own.%20Field%20...%20See%20More.
Comme pour les autres scénarios, le fournisseur de ressources détermine où obtenir les clés de signature en fonction de la configuration des métadonnées OpenId Connect et quelle clé de signature utiliser en fonction de la revendication « kid » dans le jeton d’accès. Ceci est configuré sur le fournisseur de ressources, tel que votre API personnalisée ou votre couche d’authentification API. Si vous utilisez une bibliothèque d’authentification Microsoft telle que MSAL ou Microsoft Identity Web, la valeur par défaut est généralement la suivante :
https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration
Si vous avez configuré un ID de locataire qui est par exemple « e21bbca2-1b75-4dea-9e34-d3d95d2ec661 », alors l’adresse de métadonnées serait :
https://login.microsoftonline.com/e21bbca2-1b75-4dea-9e34-d3d95d2ec661/v2.0/.well-known/openid-configuration
Si vous avez configuré une « autorité » qui ressemble à https://login.microsoftonline.us/e21bbca2-1b75-4dea-9e34-d3d95d2ec661 alors l’adresse de métadonnées serait :
https://login.microsoftonline.us/e21bbca2-1b75-4dea-9e34-d3d95d2ec661/v2.0/.well-known/openid-configuration
Le point de terminaison des métadonnées OpenId Connect possède une propriété qui fournit l’emplacement des clés de signature. Il s’agit du point de terminaison jwks_uri également connu sous le nom de point de terminaison des clés de découverte. Ainsi, en fonction du point de terminaison des métadonnées OpenId Connect utilisé, il renverra une URL pour le jwks_uri. Voici un tableau qui fournit quelques exemples :
- Exemple 1 :
Point de terminaison des métadonnées : https ://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration
Point de terminaison des clés de découverte : https ://login.microsoftonline.com/common/discovery/v2.0/keys
- Exemple 2 :
Point de terminaison des métadonnées : https ://login.microsoftonline.com/e21bbca2-1b75-4dea-9e34-d3d95d2ec661/v2.0/.well-known/openid-configuration
Point de terminaison des clés de découverte : https ://login.microsoftonline.com/e21bbca2-1b75-4dea-9e34-d3d95d2ec661/discovery/v2.0/keys
- Exemple 3 :
Point de terminaison des métadonnées : https ://login.microsoftonline.us/e21bbca2-1b75-4dea-9e34-d3d95d2ec661/v2.0/.well-known/openid-configuration
Point de terminaison des clés de découverte : https ://login.microsoftonline.us/e21bbca2-1b75-4dea-9e34-d3d95d2ec661/discovery/v2.0/keys
- Exemple 4 :
Point de terminaison des métadonnées : https ://login.microsoftonline.us/e21bbca2-1b75-4dea-9e34-d3d95d2ec661/v2.0/.well-known/openid-configuration ?appid=06051593-1954-4e1f-a75f-7e5de243aeff
Point de terminaison des clés de découverte : https ://login.microsoftonline.us/e21bbca2-1b75-4dea-9e34-d3d95d2ec661/discovery/v2.0/keys ?appid=06051593-1954-4e1f-a75f-7e5de243aeff
Notre point de terminaison de clés de découverte peut contenir plusieurs clés de signature. Par conséquent, si vous recherchez manuellement une clé spécifique et non la clé de signature fournie par le jeton d’accès ou vos clés de mise en cache, la validation de votre signature peut échouer, car nous effectuons fréquemment une rotation des clés.
https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-signing-key-rollover
Le contenu de notre point de terminaison de clés de découverte ressemblera à ceci :
« keys » : [ { « kty » : « RSA », « use » : « sig », « kid » : « nOo3ZDrODXEK1jKWhXslHR_KXEg », « x5t » : « nOo3ZDrODXEK1jKWhXslHR_KXEg », « n » : « oaLLT9hkcSj2tGf... », « e » : « AQAB », « x5c » : [ « MIIDBTCCAe... » ], « issuer » : « https://login.microsoftonline.com/aa00d1fa-5269-4e1c-b06d-30868371d2c5/v2.0 » },la revendication « kid » dans le jeton d’accès doit correspondre à l’une des clés disponibles disponibles sur le point de terminaison de clé de découverte basé sur la propriété « kid ».
Si le « kid » ne correspond pas entre le « kid » sur le jeton d’accès et les clés disponibles sur le point de terminaison de découverte, il existe deux raisons possibles :
- Azure AD et B2C utilisent des clés de signature différentes
- L’application est activée pour SAML SSO.
Azure AD et B2C utilisent des clés de signature différentes
Ensuite, nous allons examiner la revendication « iss » du jeton d’accès. Pour les jetons émis par Azure AD, il s’agit de l’une des valeurs suivantes...
Pour les jetons émis par Azure B2C, cela ressemblera à ceci...
https://{votre-domaine}.b2clogin.com/tfp/[votre-tenant-id}/{votre-id-de-politique}/v2.0/
C’est là qu’il est vraiment important de s’assurer que la configuration de vos métadonnées OpenId Connect sur le fournisseur de ressources est correctement configurée.
Pour les jetons émis par Azure AD, assurez-vous que la configuration des métadonnées OpenId Connect ressemble à ceci :
https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration
Pour plus d’informations sur les configurations Azure AD OpenId Connect :
https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-protocols-oidc
Pour les jetons émis par Azure B2C, assurez-vous que la configuration des métadonnées OpenId Connect ressemble à ceci :
https://{domain}.b2clogin.com/{tenant-id}/{b2c-policy}/v2.0/.well-known/openid-configuration
Pour plus d’informations sur les configurations Azure B2C OpenId Connect :
https://docs.microsoft.com/en-us/azure/active-directory-b2c/openid-connect
L’application est activée pour l’authentification unique SAML.
En supposant que le jeton est émis à partir d’Azure AD et non de B2C, lorsqu’une application dans Azure AD est activée pour l’authentification unique SAML, la clé de signature utilisée pour signer les jetons est le certificat de signature SAML qui a été généré lors de l’activation de l’authentification unique SAML.
Ainsi, lorsque vous recherchez le « kid » à partir du jeton d’accès sur le point de terminaison des clés de découverte par défaut, généralement « https://login.microsoftonline.com/common/discovery/v2.0/keys », vous ne le verrez peut-être pas dans la liste. Il y a plusieurs solutions. Tout d’abord, vous devez garder vos applications séparées pour OAuth2 et SAML. Il n’est pas recommandé d’utiliser la même application qui exécutera à la fois OAuth2 et SAML.
- Solution (1) : créez une inscription d’application et n’activez pas l’authentification unique SAML (approche recommandée)
- Solution (2) : vous pouvez convertir l’application d’entreprise pour utiliser OAuth2 uniquement. Pour ce faire...
- Désactivez l’authentification unique SAML (il s’agit de la propriété preferredSingleSignOnMode sur le servicePrincipal en la définissant sur null ou oidc.)
Veillez à définir la configuration des métadonnées OpenId Connect selon que le jeton est émis à partir d’Azure AD ou d’Azure B2C ou si vous devez ajouter « ?appid={appid} »
Généralement si vous configurez l’instance Azure AD et Locataire, ou Autorité correctement, cela résoudra votre problème.
L’instance
Azure AD serait https://login.microsoftonline.com
Pour plus d’informations sur les instances Azure AD :
https://docs.microsoft.com/en-us/azure/active-directory/develop/authentication-national-cloud
locataire serait contoso.onmicrosoft.com
Vous pouvez également utiliser l’identifiant du répertoire ou n’importe quel domaine vérifié. Il est recommandé d’utiliser l’ID d’annuaire ou le domaine initial fourni par Azure AD (c’est-à-dire contoso.onmicrosoft.com).
Autorité
Si la configuration d’une autorité, il n’est généralement pas nécessaire d’utiliser l’instance et le locataire, car l’autorité suit le format suivant :
{Instance}/{Tenant}
Ainsi, l’autorité serait https://login.microsoftonline.com/contoso.onmicrosoft.com Généralement,
l’adresse de métadonnées est construite en fonction de cette configuration Instance/Locataire/Autorité et concaténera automatiquement « /.well-known/openid-configuration » à la fin.
Les sections suivantes fournissent des exemples de spécification manuelle de l’adresse de métadonnées.
Utilisation des services Web d’identité Microsoft
. AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) . AddMicrosoftIdentityWebApp( options => { Configuration.Bind(« AzureAd », options) ; options. MetadataAddress = metadataAddress, }) . EnableTokenAcquisitionToCallDownstreamApi(options => Configuration.Bind(« AzureAd », options), initialScopes) . AddMicrosoftGraph(Configuration.GetSection(« GraphAPI »)) . AddInMemoryTokenCaches() ;Pour plus d’informations, consultez :
https://github.com/AzureAD/microsoft-identity-web/wiki/customization
Utilisation d’Asp.Net cadre standard à l’aide de « UseWindowsAzureActiveDirectoryBearerAuthentication »
Définissez les métadonnées sur https://login.microsoftonline.com/ application {tenant-id}/.well-known/openid-configuration
. UseWindowsAzureActiveDirectoryBearerAuthentication( new WindowsAzureActiveDirectoryBearerAuthenticationOptions { MetadataAddress = metadataAddress, Tenant = ConfigurationManager.AppSettings["ida :Tenant"], à l’aide d’Asp.Net cadre standard à l’aide de « UseOpenIdConnectAuthentication »
Vous pouvez définir l’autorité comme https://login.microsoftonline.com/{tenant-id}/v2.0
public void Configuration(IAppBuilder app) { app. AuthenticationType) ; appli. UseOpenIdConnectAuthentication( new OpenIdConnectAuthenticationOptions { // Définit le ClientId, l’autorité, le RedirectUri tels qu’obtenus à partir de web.config ClientId = clientId, Authority = authority,ou définit les métadonnées sur https://login.microsoftonline.com/{tenant-id}/v2.0/.well-known/openid-configuration
public void Configuration(IAppBuilder app) { app. AuthenticationType) ; appli. UseOpenIdConnectAuthentication( new OpenIdConnectAuthenticationOptions { // Définit le ClientId, l’autorité, le RedirectUri tels qu’obtenus à partir de web.config ClientId = clientId, MetadataAddress = metadataAddress,Utilisation de l’authentification Azure App Service
Veuillez consulter l’article suivant (Il est configuré à l’aide de l’URL de l’émetteur) :
https://docs.microsoft.com/en-us/azure/app-service/configure-authentication-provider-aad#-enable-azure-active-directory-in-your-app-service-app
Utilisation de la gestion des API Azure
Configuration pour Azure B2C : https://docs.microsoft.com/en-us/azure/active-directory-b2c/secure-api-management?tabs=app-reg-ga
https://docs.microsoft.com/en-us/azure/active-directory/develop/access-tokens#validating-tokens
https://openid.net/specs/openid-connect-discovery-1_0.htm