Compartir a través de


Habilitación de las opciones de autenticación en una aplicación web mediante Azure AD 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.

En este artículo se describe cómo habilitar, personalizar y mejorar la experiencia de autenticación de Azure Active Directory B2C (Azure AD B2C) para la aplicación web.

Antes de empezar, es importante familiarizarse con los siguientes artículos:

Uso de un dominio personalizado

Mediante el uso de un dominio personalizado, puede personalizar completamente la dirección URL de autenticación. Desde la perspectiva del usuario, los usuarios permanecen en el dominio durante el proceso de autenticación, en lugar de redirigirse al nombre de dominio de Azure AD B2C b2clogin.com.

También puede reemplazar el nombre del inquilino de B2C (contoso.onmicrosoft.com) en la dirección URL de la solicitud de autenticación por el GUID del id. de inquilino para quitar todas las referencias a "b2c" en la dirección URL. Por ejemplo, puede cambiar https://fabrikamb2c.b2clogin.com/contoso.onmicrosoft.com/ a https://account.contosobank.co.uk/<tenant ID GUID>/.

Para usar un dominio personalizado y el identificador de inquilino en la dirección URL de autenticación, siga las instrucciones de Habilitar dominios personalizados. En la carpeta raíz del proyecto, abra el archivo appsettings.json. Este archivo contiene información sobre el proveedor de identidades de Azure AD B2C.

En el archivo appsettings.json , haga lo siguiente:

El siguiente JSON muestra la configuración de la aplicación antes del cambio:

"AzureAdB2C": {
  "Instance": "https://contoso.b2clogin.com",
  "Domain": "tenant-name.onmicrosoft.com",
  ...
}

El siguiente JSON muestra la configuración de la aplicación después del cambio:

"AzureAdB2C": {
  "Instance": "https://login.contoso.com",
  "Domain": "00000000-0000-0000-0000-000000000000",
  ...
}

Compatibilidad con escenarios avanzados

El AddMicrosoftIdentityWebAppAuthentication método de la API de la plataforma de identidad de Microsoft permite a los desarrolladores agregar código para escenarios de autenticación avanzados o suscribirse a eventos openIdConnect. Por ejemplo, puede suscribirse a OnRedirectToIdentityProvider, lo que le permite personalizar la solicitud de autenticación que la aplicación envía a Azure AD B2C.

Para admitir escenarios avanzados, abra el archivo Startup.cs y, en la ConfigureServices función, reemplace por AddMicrosoftIdentityWebAppAuthentication el siguiente fragmento de código:

// Configuration to sign-in users with Azure AD B2C

//services.AddMicrosoftIdentityWebAppAuthentication(Configuration, "AzureAdB2C");

services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(options =>
{
    Configuration.Bind("AzureAdB2C", options);
    options.Events ??= new OpenIdConnectEvents();
    options.Events.OnRedirectToIdentityProvider += OnRedirectToIdentityProviderFunc;
});

El código anterior agrega el evento OnRedirectToIdentityProvider con una referencia al OnRedirectToIdentityProviderFunc método . Agregue el siguiente fragmento de código a la Startup.cs clase .

private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
{
    // Custom code here
    
    // Don't remove this line
    await Task.CompletedTask.ConfigureAwait(false);
}

Puede pasar parámetros entre el controlador y la OnRedirectToIdentityProvider función mediante parámetros de contexto.

Rellenar previamente el nombre de usuario

Durante un proceso de inicio de sesión del usuario, la aplicación podría dirigirse a un usuario específico. Cuando una aplicación tiene como destino un usuario, puede especificar en la solicitud de autorización el login_hint parámetro de consulta con el nombre de inicio de sesión del usuario. Azure AD B2C rellena automáticamente el nombre de inicio de sesión y el usuario debe proporcionar solo la contraseña.

Para rellenar previamente el nombre de inicio de sesión, haga lo siguiente:

  1. Si usa una directiva personalizada, agregue la notificación de entrada necesaria, como se describe en Configuración del inicio de sesión directo.

  2. Complete el procedimiento De escenarios avanzados de soporte técnico .

  3. Agregue la siguiente línea de código a la OnRedirectToIdentityProvider función :

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      context.ProtocolMessage.LoginHint = "emily@contoso.com";
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

Preseleccionar un proveedor de identidades

Si configuró el recorrido de inicio de sesión de la aplicación para incluir cuentas sociales, como Facebook, LinkedIn o Google, puede especificar el domain_hint parámetro . Este parámetro de consulta proporciona una sugerencia a Azure AD B2C sobre el proveedor de identidades sociales que se debe usar para el inicio de sesión. Por ejemplo, si la aplicación especifica domain_hint=facebook.com, el flujo de inicio de sesión va directamente a la página de inicio de sesión de Facebook.

Para redirigir a los usuarios a un proveedor de identidades externo, haga lo siguiente:

  1. Compruebe el nombre de dominio del proveedor de identidades externo. Para obtener más información, consulte Redireccionamiento del inicio de sesión a un proveedor de redes sociales.

  2. Complete el procedimiento De escenarios avanzados de soporte técnico .

  3. En la OnRedirectToIdentityProviderFunc función , agregue la siguiente línea de código a la OnRedirectToIdentityProvider función :

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      context.ProtocolMessage.DomainHint = "facebook.com";
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

Especificar el idioma de la interfaz de usuario

La personalización de idioma en Azure AD B2C permite al flujo de usuario adaptarse a diversas lenguas para satisfacer las necesidades de los clientes. Para obtener más información, consulte Personalización de idioma.

Para establecer el idioma preferido, haga lo siguiente:

  1. Configurar la personalización del idioma.

  2. Complete el procedimiento De escenarios avanzados de soporte técnico .

  3. Agregue la siguiente línea de código a la OnRedirectToIdentityProvider función :

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      context.ProtocolMessage.UiLocales = "es";
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

Pasar un parámetro de cadena de consulta personalizado

Con las directivas personalizadas, puede pasar un parámetro de cadena de consulta personalizado. Un buen ejemplo de caso de uso es cuando desea cambiar dinámicamente el contenido de la página.

Para pasar un parámetro de cadena de consulta personalizado, haga lo siguiente:

  1. Configure el elemento ContentDefinitionParameters .

  2. Complete el procedimiento De escenarios avanzados de soporte técnico .

  3. Agregue la siguiente línea de código a la OnRedirectToIdentityProvider función :

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      context.ProtocolMessage.Parameters.Add("campaignId", "123");
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

Paso de una sugerencia de token de identificador

Una aplicación de terceros de confianza puede enviar un JSON Web Token (JWT) entrante como parte de la solicitud de autorización de OAuth2. El token de entrada es una sugerencia sobre el usuario o la solicitud de autorización. Azure AD B2C valida el token y luego extrae la reclamación.

Para incluir una sugerencia de token de identificador en la solicitud de autenticación, haga lo siguiente:

  1. Complete el procedimiento De escenarios avanzados de soporte técnico .

  2. En la directiva personalizada, defina un perfil técnico de sugerencia para el token de identificador.

  3. Agregue la siguiente línea de código a la OnRedirectToIdentityProvider función :

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      // The idTokenHint variable holds your ID token 
      context.ProtocolMessage.IdTokenHint = idTokenHint
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

Controlador de cuenta

Si desea personalizar las acciones SignIn, SignUp o SignOut , le recomendamos que cree su propio controlador. Tener su propio controlador le permite pasar parámetros entre el controlador y la biblioteca de autenticación. AccountController forma parte del Microsoft.Identity.Web.UI paquete NuGet, que controla las acciones de inicio de sesión y cierre de sesión. Puede encontrar su implementación en la biblioteca web de identidad de Microsoft.

Agregar el controlador de cuenta

En el proyecto de Visual Studio, haga clic con el botón derecho en la carpeta Controladores y agregue un nuevo controlador. Seleccione MVC - Empty Controller (Controlador vacío) y proporcione el nombre MyAccountController.cs.

El siguiente fragmento de código muestra un personalizado MyAccountController con la acción SignIn .

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;


namespace mywebapp.Controllers
{
    [AllowAnonymous]
    [Area("MicrosoftIdentity")]
    [Route("[area]/[controller]/[action]")]
    public class MyAccountController : Controller
    {

        [HttpGet("{scheme?}")]
        public IActionResult SignIn([FromRoute] string scheme)
        {
            scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
            var redirectUrl = Url.Content("~/");
            var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
            return Challenge(properties, scheme);
        }

    }
}

En la vista _LoginPartial.cshtml , cambie el vínculo de inicio de sesión al controlador.

<form method="get" asp-area="MicrosoftIdentity" asp-controller="MyAccount" asp-action="SignIn">

Pase el identificador de directiva de Azure AD B2C

El siguiente fragmento de código muestra un personalizado MyAccountController con la acción SignIn y SignUp . La acción pasa un parámetro denominado policy a la biblioteca de autenticación. Esto le permite proporcionar el identificador de directiva de Azure AD B2C correcto para la acción específica.

public IActionResult SignIn([FromRoute] string scheme)
{
    scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
    var redirectUrl = Url.Content("~/");
    var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
    properties.Items["policy"] = "B2C_1_SignIn";
    return Challenge(properties, scheme);
}

public IActionResult SignUp([FromRoute] string scheme)
{
    scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
    var redirectUrl = Url.Content("~/");
    var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
    properties.Items["policy"] = "B2C_1_SignUp";
    return Challenge(properties, scheme);
}

En la vista _LoginPartial.cshtml , cambie el asp-controller valor a MyAccountController para cualquier otro vínculo de autenticación, como el registro o el perfil de edición.

Pasar parámetros personalizados

El siguiente fragmento de código muestra un personalizado MyAccountController con la acción SignIn . La acción pasa un parámetro denominado campaign_id a la biblioteca de autenticación.

public IActionResult SignIn([FromRoute] string scheme)
{
    scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
    var redirectUrl = Url.Content("~/");
    var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
    properties.Items["policy"] = "B2C_1_SignIn";
    properties.Items["campaign_id"] = "1234";
    return Challenge(properties, scheme);
}

Complete el procedimiento Support advanced scenarios (Compatibilidad con escenarios avanzados ) y, a continuación, en el OnRedirectToIdentityProvider método , lea el parámetro personalizado:

private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
{
    // Read the custom parameter
    var campaign_id = context.Properties.Items.FirstOrDefault(x => x.Key == "campaign_id").Value;

    // Add your custom code here
    if (campaign_id != null)
    {
        // Send parameter to authentication request
        context.ProtocolMessage.SetParameter("campaign_id", campaign_id);
    }
    
    await Task.CompletedTask.ConfigureAwait(false);
}

Protección de la redirección de cierre de sesión

Después del cierre de sesión, el usuario se redirige al URI especificado en el post_logout_redirect_uri parámetro , independientemente de las direcciones URL de respuesta especificadas para la aplicación. Sin embargo, si se pasa un valor válido id_token_hint y se activa el token requerir id. en las solicitudes de cierre de sesión , Azure AD B2C comprueba que el valor de post_logout_redirect_uri coincide con uno de los URI de redireccionamiento configurados de la aplicación antes de realizar el redireccionamiento. Si no se configuró ninguna dirección URL de respuesta coincidente para la aplicación, se muestra un mensaje de error y no se redirige al usuario.

Para admitir una redirección de cierre de sesión protegida en la aplicación, siga primero los pasos descritos en las secciones Controlador de cuenta y Compatibilidad con escenarios avanzados . A continuación, siga estos pasos:

  1. En MyAccountController.cs el controlador, agregue una acción SignOut mediante el siguiente fragmento de código:

    [HttpGet("{scheme?}")]
    public async Task<IActionResult> SignOutAsync([FromRoute] string scheme)
    {
        scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
    
        //obtain the id_token
        var idToken = await HttpContext.GetTokenAsync("id_token");
        //send the id_token value to the authentication middleware
        properties.Items["id_token_hint"] = idToken;            
    
        return SignOut(properties,CookieAuthenticationDefaults.AuthenticationScheme,scheme);
    }
    
  2. En la clase Startup.cs , analice el id_token_hint valor y anexe el valor a la solicitud de autenticación. El siguiente fragmento de código muestra cómo pasar el id_token_hint valor a la solicitud de autenticación:

    private async Task OnRedirectToIdentityProviderForSignOutFunc(RedirectContext context)
    {
        var id_token_hint = context.Properties.Items.FirstOrDefault(x => x.Key == "id_token_hint").Value;
        if (id_token_hint != null)
        {
            // Send parameter to authentication request
            context.ProtocolMessage.SetParameter("id_token_hint", id_token_hint);
        }
    
        await Task.CompletedTask.ConfigureAwait(false);
    }
    
  3. En la ConfigureServices función , agregue la SaveTokens opción Para controladores , tenga acceso al id_token valor :

    services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(options =>
        {
            Configuration.Bind("AzureAdB2C", options);
            options.Events ??= new OpenIdConnectEvents();        
            options.Events.OnRedirectToIdentityProviderForSignOut += OnRedirectToIdentityProviderForSignOutFunc;
            options.SaveTokens = true;
        });
    
  4. En el archivo de configuración appsettings.json , agregue la ruta de acceso del URI de redirección de cierre de sesión a la SignedOutCallbackPath clave.

    "AzureAdB2C": {
      "Instance": "https://<your-tenant-name>.b2clogin.com",
      "ClientId": "<web-app-application-id>",
      "Domain": "<your-b2c-___domain>",
      "SignedOutCallbackPath": "/signout/<your-sign-up-in-policy>",
      "SignUpSignInPolicyId": "<your-sign-up-in-policy>"
    }
    

En el ejemplo anterior, el post_logout_redirect_uri pasado a la solicitud de cierre de sesión tendrá el formato : https://your-app.com/signout/<your-sign-up-in-policy>. Esta dirección URL debe agregarse a la dirección URL de respuesta del registro de aplicaciones.

Control de acceso basado en roles

Con la autorización en ASP.NET Core , puede comprobar si los usuarios tienen autorización para acceder a un recurso protegido mediante uno de los métodos siguientes:

En el ConfigureServices método , agregue el AddAuthorization método , que agrega el modelo de autorización. En el ejemplo siguiente se crea una directiva denominada EmployeeOnly. La directiva comprueba si existe una notificación EmployeeNumber . El valor de la notificación debe ser uno de los siguientes identificadores: 1, 2, 3, 4 o 5.

services.AddAuthorization(options =>
    {
        options.AddPolicy("EmployeeOnly", policy =>
              policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
    });

Puede controlar la autorización en ASP.NET Core mediante AuthorizeAttribute y sus diversos parámetros. En su forma más básica, aplicar el atributo a un controlador, una acción o una página de Razor limita el Authorize acceso a los usuarios autenticados de ese componente.

Las directivas se aplican a los controladores mediante el atributo con el Authorize nombre de la directiva. El código siguiente limita el acceso a la Claims acción a los usuarios autorizados por la EmployeeOnly directiva:

[Authorize(Policy = "EmployeeOnly")]
public IActionResult Claims()
{
    return View();
}

Pasos siguientes