Partager via


Définir un profil technique d’indicateur de jeton d’ID dans une stratégie personnalisée Azure Active Directory B2C

Important

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

Azure AD B2C permet aux applications de partie de confiance d’envoyer un JWT entrant dans le cadre de la demande d’autorisation OAuth2. Le JWT peut être émis par une application de partie de confiance ou un fournisseur d’identité, et il peut transmettre un indicateur sur l’utilisateur ou la demande d’autorisation. Azure AD B2C valide la signature, le nom de l’émetteur et l’audience de jeton, et extrait la revendication du jeton entrant.

Cas d’utilisation

Vous pouvez utiliser cette solution pour envoyer des données à Azure AD B2C encapsulées dans un seul JWT. La Signup with email invitation solution, où votre administrateur système peut envoyer une invitation signée aux utilisateurs, est basée sur id_token_hint. Seuls les utilisateurs ayant accès à l’e-mail d’invitation peuvent créer le compte dans l’annuaire.

Approche de signature de jeton

Avec id_token_hint, l’émetteur de jeton (une application de partie de confiance ou un fournisseur d’identité) compose le jeton, puis le signe à l’aide d’une clé de signature pour prouver que le jeton provient d’une source approuvée. La clé de signature peut être symétrique ou asymétrique. Le chiffrement symétrique ou le chiffrement à clé privée utilise un secret partagé pour signer et valider la signature. Le chiffrement asymétrique ou le chiffrement à clé publique est un système de chiffrement qui utilise à la fois une clé privée et une clé publique. La clé privée est connue uniquement de l’émetteur du jeton et est utilisée pour signer le jeton. La clé publique est partagée avec la stratégie Azure AD B2C pour valider la signature du jeton.

Format de jeton

Le id_token_hint doit être un JWT valide. Le tableau suivant répertorie les revendications obligatoires. Les revendications supplémentaires sont facultatives.

Nom Réclamation Exemple de valeur Descriptif
Public visé aud 00001111-aaaa-2222-bbbb-3333cccc4444 Identifie le destinataire du jeton. L’audience est une chaîne arbitraire définie par l’émetteur de jeton. Azure AD B2C valide cette valeur et rejette le jeton s’il ne correspond pas.
Émetteur iss https://localhost Identifie le service de jeton de sécurité (émetteur de jeton). L’émetteur est un URI arbitraire défini par l’émetteur de jeton. Azure AD B2C valide cette valeur et rejette le jeton s’il ne correspond pas.
Heure d’expiration exp 1600087315 Heure à laquelle le jeton n’est plus valide, représentée en heure epoch. Azure AD B2C valide cette valeur et rejette le jeton si le jeton a expiré.
Pas avant nbf 1599482515 Heure à laquelle le jeton est valide, représentée en heure epoch. Cette heure correspond généralement à l’heure à laquelle le jeton a été émis. Azure AD B2C valide cette valeur et rejette le jeton si la durée de vie du jeton n’est pas valide.

Le jeton suivant est un exemple de jeton d’ID valide :

{
  "alg": "HS256",
  "typ": "JWT"
}.{
  "displayName": " John Smith",
  "userId": "john.s@contoso.com",
  "nbf": 1599482515,
  "exp": 1600087315,
  "iss": "https://localhost",
  "aud": "00001111-aaaa-2222-bbbb-3333cccc4444"
}

Protocole

L’attribut Name de l’élément Protocol doit être défini sur None. Par exemple, le protocole pour le profil technique IdTokenHint_ExtractClaims est None:

<TechnicalProfile Id="IdTokenHint_ExtractClaims">
  <DisplayName> My ID Token Hint TechnicalProfile</DisplayName>
  <Protocol Name="None" />
  ...

Le profil technique est appelé à partir d’une étape d’orchestration avec le type de GetClaims.

<OrchestrationStep Order="1" Type="GetClaims" CpimIssuerTechnicalProfileReferenceId="IdTokenHint_ExtractClaims" />

Revendications de sortie

L’élément OutputClaims contient une liste de revendications à extraire du JWT. Vous devrez peut-être mapper le nom de la revendication définie dans votre stratégie au nom défini dans le JWT. Vous pouvez également inclure des revendications qui ne sont pas retournées par le JWT, tant que vous définissez l’attribut DefaultValue .

Métadonnées

Les métadonnées suivantes sont pertinentes lors de l’utilisation de la clé symétrique.

Caractéristique Obligatoire Descriptif
émetteur Oui Identifie le service de jeton de sécurité (émetteur de jeton). Cette valeur doit être identique à la iss revendication dans la revendication JWT.
IdTokenAudience Oui Identifie le destinataire du jeton. Doit être identique à la aud revendication dans la revendication JWT.

Les métadonnées suivantes sont pertinentes lors de l’utilisation d’une clé asymétrique.

Caractéristique Obligatoire Descriptif
MÉTADONNÉES Oui URL qui pointe vers un document de configuration d’émetteur de jeton, également appelée point de terminaison de configuration OpenID connu.
émetteur Non Identifie le service de jeton de sécurité (émetteur de jeton). Cette valeur peut être utilisée pour remplacer la valeur configurée dans les métadonnées et doit être identique à la iss revendication dans la revendication JWT.
IdTokenAudience Non Identifie le destinataire du jeton. Doit être identique à la aud revendication dans la revendication JWT.

Important

Vos points de terminaison doivent respecter les exigences de sécurité Azure AD B2C. Les versions et les chiffrements TLS plus anciens sont déconseillés. Pour plus d’informations, consultez la configuration requise pour azure AD B2C TLS et la suite de chiffrement.

Clés de chiffrement

Lorsque vous utilisez une clé symétrique, l’élément CryptographicKeys contient l’attribut suivant :

Caractéristique Obligatoire Descriptif
secret du client Oui Clé de chiffrement utilisée pour valider la signature JWT.

Guide pratique

Émettre un jeton avec des clés symétriques

Étape 1 : Créer une clé partagée

Créez une clé qui peut être utilisée pour signer le jeton. Par exemple, utilisez le code PowerShell suivant pour générer une clé.

$bytes = New-Object Byte[] 32
$rand = [System.Security.Cryptography.RandomNumberGenerator]::Create()
$rand.GetBytes($bytes)
$rand.Dispose()
$newClientSecret = [System.Convert]::ToBase64String($bytes)
$newClientSecret

Ce code crée une chaîne secrète comme VK62QTn0m1hMcn0DQ3RPYDAr6yIiSvYgdRwjZtU5QhI=.

Étape 2 : Ajouter la clé de signature à Azure AD B2C

La même clé que celle utilisée par l’émetteur de jeton doit être créée dans vos clés de stratégie Azure AD B2C.

  1. Connectez-vous au portail Azure.
  2. Si vous avez accès à plusieurs tenants (locataires), sélectionnez l’icône Paramètres dans le menu supérieur pour basculer vers votre tenant Azure AD B2C à partir du menu Annuaires + abonnements.
  3. Dans le portail Azure, recherchez et sélectionnez Azure AD B2C.
  4. Dans la page vue d’ensemble, sous Stratégies, sélectionnez Identity Experience Framework.
  5. Sélectionner des clés de stratégie
  6. Sélectionnez Manuel.
  7. Pour Nom, utilisez IdTokenHintKey.
    Le préfixe B2C_1A_ peut être ajouté automatiquement.
  8. Dans la zone Secret , entrez la clé de connexion que vous avez générée précédemment.
  9. Pour l’utilisation de la clé, utilisez le chiffrement.
  10. Cliquez sur Créer.
  11. Vérifiez que vous avez créé la clé B2C_1A_IdTokenHintKey.

Étape 3 : Ajouter le profil technique d’indicateur de jeton d’ID

Le profil technique suivant valide le jeton et extrait les revendications.

<ClaimsProvider>
  <DisplayName>My ID Token Hint ClaimsProvider</DisplayName>
  <TechnicalProfiles>
    <TechnicalProfile Id="IdTokenHint_ExtractClaims">
      <DisplayName> My ID Token Hint TechnicalProfile</DisplayName>
      <Protocol Name="None" />
      <Metadata>
        <Item Key="IdTokenAudience">00001111-aaaa-2222-bbbb-3333cccc4444</Item>
        <Item Key="issuer">https://localhost</Item>
      </Metadata>
      <CryptographicKeys>
        <Key Id="client_secret" StorageReferenceId="B2C_1A_IdTokenHintKey" />
      </CryptographicKeys>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="userId" />
      </OutputClaims>
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>

Étape 4 : Préparer votre stratégie

Terminez l’étape Configurer votre stratégie .

Étape 5 : Préparer le code

L’exemple GitHub est une application web et une application console ASP.NET qui génère un jeton d’ID signé à l’aide d’une clé symétrique.

Émettre un jeton avec des clés asymétriques

Avec une clé asymétrique, le jeton est signé à l’aide de certificats RSA. Cette application héberge un point de terminaison de métadonnées OpenID Connect et un point de terminaison JWK (JSON Web Keys) utilisé par Azure AD B2C pour valider la signature du jeton d’ID.

L’émetteur de jeton doit fournir les points de terminaison suivants :

  • /.well-known/openid-configuration - Point de terminaison de configuration connu avec des informations pertinentes sur le jeton, telles que le nom de l’émetteur du jeton et le lien vers le point de terminaison JWK.
  • /.well-known/keys - point de terminaison JWK (JSON Web Key) avec la clé publique utilisée pour signer la clé (avec la partie clé privée du certificat).

Consultez l’exemple de TokenMetadataController.cs contrôleur .NET MVC.

Étape 1 : Préparer un certificat auto-signé

Si vous n’avez pas encore de certificat, vous pouvez utiliser un certificat auto-signé pour ce guide pratique. Sur Windows, vous pouvez utiliser l’applet de commande New-SelfSignedCertificate de PowerShell pour générer un certificat.

Exécutez cette commande PowerShell pour générer un certificat auto-signé. Modifiez l’argument -Subject le cas échéant pour votre application et le nom du locataire Azure AD B2C. Vous pouvez également ajuster la date de -NotAfter pour spécifier un délai d’expiration différent pour le certificat.

New-SelfSignedCertificate `
    -KeyExportPolicy Exportable `
    -Subject "CN=yourappname.yourtenant.onmicrosoft.com" `
    -KeyAlgorithm RSA `
    -KeyLength 2048 `
    -KeyUsage DigitalSignature `
    -NotAfter (Get-Date).AddMonths(12) `
    -CertStoreLocation "Cert:\CurrentUser\My"

Étape 2 : Ajouter le profil technique d’indicateur de jeton d’ID

Le profil technique suivant valide le jeton et extrait les revendications. Remplacez l’URI des métadonnées par votre point de terminaison de configuration connu de l’émetteur de jeton.

<ClaimsProvider>
  <DisplayName>My ID Token Hint ClaimsProvider</DisplayName>
  <TechnicalProfiles>
    <TechnicalProfile Id="IdTokenHint_ExtractClaims">
      <DisplayName> My ID Token Hint TechnicalProfile</DisplayName>
      <Protocol Name="None" />
      <Metadata>
        <!-- Replace with your endpoint location -->
        <Item Key="METADATA">https://your-app.azurewebsites.net/.well-known/openid-configuration</Item>
        <Item Key="IdTokenAudience">your_optional_audience</Item>
        <!-- <Item Key="issuer">your_optional_token_issuer_override</Item> -->
      </Metadata>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="userId" />
      </OutputClaims>
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>

Étape 3 : Préparer votre stratégie

Terminez l’étape Configurer votre stratégie .

Étape 4 : Préparer le code

Cet exemple gitHub ASP.NET application web génère des jetons d’ID et héberge les points de terminaison de métadonnées requis pour utiliser le paramètre « id_token_hint » dans Azure AD B2C.

Configurer votre stratégie

Pour les approches symétriques et asymétriques, le id_token_hint profil technique est appelé à partir d’une étape d’orchestration avec le type et GetClaims doit spécifier les revendications d’entrée de la stratégie de partie de confiance.

  1. Ajoutez le profil technique IdTokenHint_ExtractClaims à votre stratégie d’extension.

  2. Ajoutez l’étape d’orchestration suivante à votre parcours utilisateur en tant que premier élément.

    <OrchestrationStep Order="1" Type="GetClaims" CpimIssuerTechnicalProfileReferenceId="IdTokenHint_ExtractClaims" />
    
  3. Dans votre stratégie de partie de confiance, répétez les mêmes revendications d’entrée que celles que vous avez configurées dans le profil technique IdTokenHint_ExtractClaims. Par exemple:

    <RelyingParty>
      <DefaultUserJourney ReferenceId="SignUp" />
      <TechnicalProfile Id="PolicyProfile">
        <DisplayName>PolicyProfile</DisplayName>
        <Protocol Name="OpenIdConnect" />
        <InputClaims>
          <InputClaim ClaimTypeReferenceId="email" PartnerClaimType="userId" />
        </InputClaims>
        <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="displayName" />
          <OutputClaim ClaimTypeReferenceId="givenName" />
          <OutputClaim ClaimTypeReferenceId="surname" />
          <OutputClaim ClaimTypeReferenceId="email" />
          <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
          <OutputClaim ClaimTypeReferenceId="identityProvider" />
        </OutputClaims>
        <SubjectNamingInfo ClaimType="sub" />
      </TechnicalProfile>
    </RelyingParty>
    

Selon vos besoins métier, vous devrez peut-être ajouter des validations de jetons, par exemple vérifier le format de l’adresse e-mail. Pour ce faire, ajoutez des étapes d’orchestration qui appellent un profil technique de transformation de revendications. Ajoutez également un profil technique autodéclaré pour présenter un message d’erreur.

Créer et signer un jeton

Les exemples GitHub montrent comment créer un jeton de ce type émettre un jeton JWT envoyé ultérieurement en tant que id_token_hint paramètre de chaîne de requête. Voici un exemple de demande d’autorisation avec id_token_hint paramètre

https://tenant-name.b2clogin.com/tenant-name.onmicrosoft.com/B2C_1A_signup_signin/oauth2/v2.0/authorize?client_id=11112222-bbbb-3333-cccc-4444dddd5555&nonce=defaultNonce&redirect_uri=https%3A%2F%2Fjwt.ms&scope=openid&response_type=id_token&prompt=login&id_token_hint=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaXNwbGF5TmFtZSI6IiBKb2huIFNtaXRoIiwidXNlcklkIjoiam9obi5zQGNvbnRvc28uY29tIiwibmJmIjoxNTk5NDgyNTE1LCJleHAiOjE2MDAwODczMTUsImlzcyI6Imh0dHBzOi8vbG9jYWxob3N0IiwiYXVkIjoiYTQ4OWZjNDQtM2NjMC00YTc4LTkyZjYtZTQxM2NkODUzZWFlIn0.nPmLXydI83PQCk5lRBYUZRu_aX58pL1khahHyQuupig

Étapes suivantes