Migración de una API web basada en OWIN a b2clogin.com o a un dominio personalizado

En este artículo se describe una técnica para habilitar la compatibilidad con varios emisores de tokens en API web que implementan la interfaz web abierta para .NET (OWIN). La compatibilidad con varios puntos de conexión de token es útil cuando se migran API de Azure Active Directory B2C (Azure AD B2C) y sus aplicaciones de un dominio a otro. Por ejemplo, de login.microsoftonline.com a b2clogin.com, o a un dominio personalizado.

Al agregar compatibilidad en la API para aceptar tokens que ha emitido b2clogin.com, login.microsoftonline.com o un dominio personalizado, puede migrar las aplicaciones web de manera escalonada antes de quitar la compatibilidad con los tokens emitidos por login.microsoftonline.com de la API.

En las secciones siguientes se muestra un ejemplo de cómo habilitar varios emisores en una API web que usa los componentes de middleware de Microsoft OWIN (Katana). Aunque los ejemplos de código son específicos del middleware de Microsoft OWIN, la técnica general debería ser aplicable a otras bibliotecas OWIN.

Prerrequisitos

Antes de continuar con los pasos de este artículo, necesita tener los siguientes recursos de Azure AD B2C:

Obtención de los puntos de conexión de emisores de tokens

Primero, debe obtener los URI del punto de conexión de emisor de token para cada emisor que quiera admitir en la API. Para obtener los puntos de conexión b2clogin.com y login.microsoftonline.com que se admiten en su inquilino de Azure AD B2C, use el siguiente procedimiento en Azure Portal.

Para empezar, seleccione uno de los flujos de usuario existentes:

  1. Vaya a su inquilino de Azure AD B2C en Azure Portal.

  2. En Directivas, seleccioneFlujos de usuario (directivas) .

  3. Seleccione una directiva existente, por ejemplo B2C_1_signupsignin1 y, luego, seleccione Ejecutar flujo de usuario.

  4. En el encabezado Ejecutar flujo de usuario situado cerca de la parte superior de la página, seleccione el hipervínculo para ir hasta el punto de conexión de detección de OpenID Connect para ese flujo de usuario.

    Hipervínculo de URI conocido en la página Ejecutar ahora de Azure Portal

  5. En la página que se abre en el explorador, registre el valor issuer, por ejemplo:

    https://your-b2c-tenant.b2clogin.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/

  6. Use la lista desplegable Seleccionar dominio para seleccionar el otro dominio y, después, vuelva a realizar los dos pasos anteriores y registre su valor issuer.

Ahora debería tener dos identificadores URI registrados similares a:

https://login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/
https://your-b2c-tenant.b2clogin.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/

Directivas personalizadas

Si tiene directivas personalizadas en lugar de flujos de usuario, puede usar un proceso similar para obtener los URI del emisor.

  1. Ir al inquilino de Azure AD B2C
  2. Seleccione Marco de experiencia de identidad.
  3. Seleccione una de las directivas de usuario de confianza, por ejemplo, B2C_1A_signup_signin.
  4. Use la lista desplegable Seleccionar dominio para seleccionar un dominio, por ejemplo, yourtenant.b2clogin.com.
  5. Seleccione el hipervínculo que se muestra en el punto de conexión de detección de OpenID Connect.
  6. Registre el valor de issuer.
  7. Siga los pasos del 4 al 6 con el otro dominio, por ejemplo, login.microsoftonline.com.

Obtención del código de ejemplo

Ahora que tiene ambos URI de punto de conexión de token, debe actualizar el código para especificar que ambos puntos de conexión son emisores válidos. Para examinar un ejemplo, descargue o clone la aplicación de ejemplo y, luego, actualice el ejemplo para admitir ambos puntos de conexión como emisores válidos.

Descargue el archivo: active-directory-b2c-dotnet-webapp-and-webapi-master.zip

git clone https://github.com/Azure-Samples/active-directory-b2c-dotnet-webapp-and-webapi.git

Habilitación de varios emisores en API web

En esta sección, actualizará el código para especificar que ambos puntos de conexión de emisores de tokens son válidos.

  1. Abra la solución B2C-WebAPI-DotNet.sln en Visual Studio.

  2. En el proyecto TaskService, abra el archivo TaskService\App_Start\Startup.Auth.cs en el editor.

  3. Agregue la siguiente directiva using al principio del archivo:

    using System.Collections.Generic;

  4. Agregue la propiedad ValidIssuers a la definición TokenValidationParameters y especifique los dos identificadores URI que registró en la sección anterior:

    TokenValidationParameters tvps = new TokenValidationParameters
    {
        // Accept only those tokens where the audience of the token is equal to the client ID of this app
        ValidAudience = ClientId,
        AuthenticationType = Startup.DefaultPolicy,
        ValidIssuers = new List<string> {
            "https://login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/",
            "https://{your-b2c-tenant}.b2clogin.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/"//,
            //"https://your-custom-domain/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/"
        }
    };
    

MSAL.NET proporciona TokenValidationParameters y lo consume el middleware OWIN en la siguiente sección de código de Startup.Auth.cs. . Si se especifican varios emisores válidos, la canalización de la aplicación OWIN es consciente de que ambos puntos de conexión de token son emisores válidos.

app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
{
    // This SecurityTokenProvider fetches the Azure AD B2C metadata &  from the OpenID Connect metadata endpoint
    AccessTokenFormat = new JwtFormat(tvps, new tCachingSecurityTokenProvider(String.Format(AadInstance, ultPolicy)))
});

Como se mencionó anteriormente, otras bibliotecas OWIN proporcionan normalmente una instalación similar para admitir varios emisores. Aunque el objetivo de este artículo no es proporcionar ejemplos de cada biblioteca, puede usar una técnica similar con la mayoría de ellas.

Cambio de los puntos de conexión en la aplicación web

Ahora que ya se admiten ambos URI en la API web, el siguiente paso es actualizar la aplicación web para que recupere los tokens del punto de conexión b2clogin.com.

Por ejemplo, puede configurar la aplicación web de ejemplo para que use el nuevo punto de conexión mediante la modificación del valor ida:AadInstance en el archivo TaskWebAppWeb.config del proyecto TaskWebApp.

Cambie el valor ida:AadInstance en Web.config de TaskWebApp para que haga referencia a {your-b2c-tenant-name}.b2clogin.com y no a login.microsoftonline.com.

Antes:

<!-- Old value -->
<add key="ida:AadInstance" value="https://login.microsoftonline.com/tfp/{0}/{1}" />

Después, reemplace {your-b2c-tenant} por el nombre de su inquilino B2C:

<!-- New value -->
<add key="ida:AadInstance" value="https://{your-b2c-tenant}.b2clogin.com/tfp/{0}/{1}" />

Cuando las cadenas de punto de conexión se construyen durante la ejecución de la aplicación web, se usan los puntos de conexión basados en b2clogin.com cuando se solicitan tokens.

Al usar el dominio personalizado:

<!-- Custom domain -->
<add key="ida:AadInstance" value="https://custom-domain/{0}/{1}" />

Pasos siguientes

En este artículo se ha presentado un método para configurar una API web que implementa el middleware de Microsoft OWIN (Katana) para aceptar tokens de varios puntos de conexión de emisor. Como puede observar, hay otras diversas cadenas en los archivos Web.Config de los proyectos TaskService y TaskWebApp que deberían cambiarse si quiere compilar y ejecutar estos proyectos en su propio inquilino. Puede modificar los proyectos de forma adecuada si quiere verlos en acción; sin embargo, el objetivo de este artículo no es mostrar un tutorial completo de cómo hacerlo.

Para más información sobre los diferentes tipos de tokens de seguridad emitidos por Azure AD B2C, consulte Introducción a los tokens en Active Directory B2C.