Compartir a través de


Definición de un perfil técnico de sugerencia de token de identificador en una directiva personalizada de Azure Active Directory B2C

Importante

A partir del 1 de mayo de 2025, Azure AD B2C ya no estará disponible para la compra por parte de nuevos clientes. Obtenga más información en nuestras preguntas más frecuentes.

Azure AD B2C permite a las aplicaciones de usuario de confianza enviar un JWT entrante como parte de la solicitud de autorización de OAuth2. El JWT se puede emitir mediante una aplicación de usuario de confianza o un proveedor de identidades, y puede pasar una sugerencia sobre el usuario o la solicitud de autorización. Azure AD B2C valida la firma, el nombre del emisor y la audiencia de tokens, y extrae la notificación del token de entrada.

Casos de uso

Puede usar esta solución para enviar datos a Azure AD B2C encapsulado en un único JWT. La Signup with email invitation solución, donde el administrador del sistema puede enviar una invitación firmada a los usuarios, se basa en id_token_hint. Solo los usuarios con acceso al correo electrónico de invitación pueden crear la cuenta en el directorio.

Enfoque de firma de tokens

Con id_token_hint, el emisor de tokens (una aplicación de usuario de confianza o un proveedor de identidades) compone el token y, a continuación, lo firma mediante una clave de firma para demostrar que el token procede de un origen de confianza. La clave de firma puede ser simétrica o asimétrica. La criptografía simétrica o la criptografía de clave privada usan un secreto compartido para firmar y validar la firma. La criptografía asimétrica o la criptografía de clave pública es un sistema criptográfico que usa una clave privada y una clave pública. La clave privada solo se conoce con el emisor de tokens y se usa para firmar el token. La clave pública se comparte con la directiva de Azure AD B2C para validar la firma del token.

Formato de token

El id_token_hint debe ser un JWT válido. En la tabla siguiente se enumeran las notificaciones que son obligatorias. Las notificaciones adicionales son opcionales.

Nombre Reclamación Ejemplo de valor Descripción
Público aud 00001111-aaaa-2222-bbbb-3333cccc4444 Identifica al destinatario previsto del token. La audiencia es una cadena arbitraria definida por el emisor del token. Azure AD B2C valida este valor y rechaza el token si no coincide.
Emisor iss https://localhost Identifica el servicio de token de seguridad (emisor de tokens). El emisor es un URI arbitrario definido por el emisor del token. Azure AD B2C valida este valor y rechaza el token si no coincide.
Fecha de expiración exp 1600087315 La hora en que el token deja de ser válido, que se representa en tiempo de época. Azure AD B2C valida este valor y rechaza el token si el token ha expirado.
No antes de nbf 1599482515 Hora a la que el token pasa a ser válido, representada en tiempo de época. Esta hora suele ser la misma que la hora en que se emitió el token. Azure AD B2C valida este valor y rechaza el token si la duración del token no es válida.

El siguiente token es un ejemplo de un token de identificador válido:

{
  "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"
}

Protocolo

El atributo Name del elemento Protocol tiene que establecerse en None. Por ejemplo, el protocolo para el perfil técnico de IdTokenHint_ExtractClaims es None:

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

Se llama al perfil técnico desde un paso de orquestación con el tipo de GetClaims.

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

Notificaciones de salida

El elemento OutputClaims contiene una lista de notificaciones que se van a extraer del JWT. Es posible que tenga que asignar el nombre de la notificación definida en la directiva al nombre definido en el JWT. También puede incluir notificaciones que el JWT no devuelve, siempre y cuando establezca el DefaultValue atributo .

Metadatos

Los metadatos siguientes son relevantes cuando se usa la clave simétrica.

Atributo Obligatorio Descripción
Emisor Identifica el servicio de token de seguridad (emisor de tokens). Este valor debe ser idéntico a la iss notificación dentro de la notificación JWT.
IdTokenAudience Identifica al destinatario previsto del token. Debe ser idéntico a la aud notificación dentro de la notificación JWT.

Los metadatos siguientes son relevantes cuando se usa una clave asimétrica.

Atributo Obligatorio Descripción
METADATOS Dirección URL que apunta a un documento de configuración del emisor de tokens, que también se conoce como punto de conexión de configuración conocido de OpenID.
Emisor No Identifica el servicio de token de seguridad (emisor de tokens). Este valor se puede usar para sobrescribir el valor configurado en los metadatos y debe ser idéntico a la iss notificación dentro de la notificación JWT.
IdTokenAudience No Identifica al destinatario previsto del token. Debe ser idéntico a la aud notificación dentro de la notificación JWT.

Importante

Los puntos de conexión deben cumplir los requisitos de seguridad de Azure AD B2C. Las versiones anteriores de TLS y los cifrados están en desuso. Para obtener más información, consulte Requisitos de TLS y del conjunto de cifrado de Azure AD B2C.

Claves criptográficas

Cuando se usa una clave simétrica, el elemento CryptographicKeys contiene el atributo siguiente:

Atributo Obligatorio Descripción
secreto_del_cliente Clave criptográfica que se usa para validar la firma JWT.

Guía paso a paso

Emitir un token con claves simétricas

Paso 1: Crear una clave compartida

Cree una clave que se pueda usar para firmar el token. Por ejemplo, use el siguiente código de PowerShell para generar una clave.

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

Este código crea una cadena secreta como VK62QTn0m1hMcn0DQ3RPYDAr6yIiSvYgdRwjZtU5QhI=.

Paso 2: Adición de la clave de firma a Azure AD B2C

La misma clave que usa el emisor de tokens debe crearse en las claves de directiva de Azure AD B2C.

  1. Inicie sesión en Azure Portal.
  2. Si tiene acceso a varios inquilinos, seleccione el icono Configuración en el menú superior para cambiar a su inquilino de Azure AD B2C desde el menú Directorios y suscripciones.
  3. En Azure Portal, busque y seleccione Azure AD B2C.
  4. En la página de información general, en Directivas, seleccione Identity Experience Framework.
  5. Seleccione Claves de directiva
  6. Seleccione Manual.
  7. En Nombre, use IdTokenHintKey.
    Es posible que el prefijo B2C_1A_ se agregue automáticamente.
  8. En el cuadro Secreto , escriba la clave de inicio de sesión que generó anteriormente.
  9. Para el uso de claves, use Cifrado.
  10. Selecciona Crear.
  11. Confirme que ha creado la clave B2C_1A_IdTokenHintKey.

Paso 3: Agregar el perfil técnico de la sugerencia de token de identificador

El siguiente perfil técnico valida el token y extrae las notificaciones.

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

Paso 4: Preparar la directiva

Complete el paso Configurar la directiva .

Paso 5: Preparación del código

El ejemplo de GitHub es una aplicación web ASP.NET y una aplicación de consola que genera un token de identificador firmado mediante una clave simétrica.

Emitir un token con claves asimétricas

Con una clave asimétrica, el token se firma mediante certificados RSA. Esta aplicación hospeda un punto de conexión de metadatos de OpenID Connect y un punto de conexión de claves web JSON (JWK) que usa Azure AD B2C para validar la firma del token de identificador.

El emisor de tokens debe proporcionar los siguientes puntos de conexión:

  • /.well-known/openid-configuration - Un punto de conexión de configuración conocido con información relevante sobre el token, como el nombre del emisor de tokens y el vínculo al punto de conexión JWK.
  • /.well-known/keys : punto de conexión de clave web JSON (JWK) con la clave pública que se usa para firmar la clave (con la parte de clave privada del certificado).

Consulte el ejemplo del TokenMetadataController.cs controlador MVC de .NET.

Paso 1: Preparar un certificado autofirmado

Si aún no tiene un certificado, puede usar un certificado autofirmado para esta guía paso a paso. En Windows, puede usar el cmdlet New-SelfSignedCertificate de PowerShell para generar un certificado.

Ejecute este comando de PowerShell para generar un certificado autofirmado. Modifique el argumento según corresponda para la aplicación y el -Subject nombre del inquilino de Azure AD B2C. También puede ajustar la fecha de -NotAfter para especificar una expiración diferente para el certificado.

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"

Paso 2: Agregar el perfil técnico de la sugerencia de token de identificador

El siguiente perfil técnico valida el token y extrae las notificaciones. Cambie el URI de metadatos al punto de conexión de configuración conocido del emisor de tokens.

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

Paso 3: Preparación de la directiva

Complete el paso Configurar la directiva .

Paso 4: Preparación del código

Este ejemplo de GitHub ASP.NET aplicación web genera tokens de identificador y hospeda los puntos de conexión de metadatos necesarios para usar el parámetro "id_token_hint" en Azure AD B2C.

Configuración de la directiva

En el caso de los enfoques simétricos y asimétricos, se llama al id_token_hint perfil técnico desde un paso de orquestación con el tipo de GetClaims y necesita especificar las notificaciones de entrada de la directiva de usuario de confianza.

  1. Agregue el perfil técnico IdTokenHint_ExtractClaims a la directiva de extensión.

  2. Agregue el siguiente paso de orquestación al recorrido del usuario como primer elemento.

    <OrchestrationStep Order="1" Type="GetClaims" CpimIssuerTechnicalProfileReferenceId="IdTokenHint_ExtractClaims" />
    
  3. En la directiva de usuario de confianza, repita las mismas notificaciones de entrada que configuró en el perfil técnico de IdTokenHint_ExtractClaims. Por ejemplo:

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

En función de los requisitos empresariales, es posible que tenga que agregar validaciones de token, por ejemplo, comprobar el formato de la dirección de correo electrónico. Para ello, agregue pasos de orquestación que invoquen un perfil técnico de transformación de notificaciones. Agregue también un perfil técnico autoafirmado para presentar un mensaje de error.

Creación y firma de un token

En los ejemplos de GitHub se muestra cómo crear este tipo de token un JWT que se envió posteriormente como un id_token_hint parámetro de cadena de consulta. A continuación se muestra un ejemplo de una solicitud de autorización con id_token_hint parámetro

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

Pasos siguientes