Share via


Habilitación de las opciones de autenticación en una aplicación web mediante Azure AD B2C

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 una 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 el punto de vista del usuario, este permanece en el dominio durante el proceso de autenticación, en lugar de que se le redirija al nombre de dominio b2clogin.com de Azure AD B2C.

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 identificador 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/ por 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 que se indican en Habilitación de 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 método AddMicrosoftIdentityWebAppAuthentication de la API de la plataforma de identidad de Microsoft permite a los desarrolladores agregar código para escenarios de autenticación avanzada o suscribirse a eventos de OpenIDConnect. Por ejemplo, puede suscribirse a OnRedirectToIdentityProvider, 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 función ConfigureServices, reemplace AddMicrosoftIdentityWebAppAuthentication por 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 método OnRedirectToIdentityProviderFunc. Agregue el siguiente fragmento de código a la clase Startup.cs.

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 función OnRedirectToIdentityProvider mediante parámetros de contexto.

Rellenar previamente el nombre de inicio de sesión

Durante el recorrido de inicio de sesión de un usuario, la aplicación podría tener como destino un usuario específico. Cuando una aplicación se dirige a un usuario, puede especificar, en la solicitud de autorización, el parámetro de consulta login_hint con el nombre de inicio de sesión de usuario. Azure AD B2C rellena automáticamente el nombre de inicio de sesión y solo es necesario que el usuario proporcione 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 Compatibilidad con escenarios avanzados.

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

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

Preseleccione un proveedor de identidad

Si se ha configurado el recorrido de inicio de sesión para que la aplicación incluya cuentas de redes sociales como Facebook, LinkedIn o Google, puede especificar el parámetro domain_hint. Este parámetro de consulta proporciona una sugerencia a Azure AD B2C acerca del proveedor de identidades sociales que debe usarse para iniciar 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 más información, consulte Redirección del inicio de sesión a un proveedor social.

  2. Complete el procedimiento Compatibilidad con escenarios avanzados.

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

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

Especificación del idioma de la interfaz de usuario

La personalización del idioma en Azure AD B2C permite que el flujo de usuario albergue diversos idiomas a fin de 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. Configure la personalización de idioma.

  2. Complete el procedimiento Compatibilidad con escenarios avanzados.

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

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

Paso de 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 se 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 Compatibilidad con escenarios avanzados.

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

    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 usuario de confianza puede enviar un token JSON Web Token (JWT) de entrada 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, a continuación, extrae la notificación.

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

  1. Complete el procedimiento Compatibilidad con escenarios avanzados.

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

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

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

Si quiere personalizar las acciones SignIn, SignUp o SignOut, se recomienda crear 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 paquete NuGet Microsoft.Identity.Web.UI, que controla las acciones de inicio y cierre de sesión. Puede encontrar su implementación en la biblioteca web de identidad de Microsoft.

Incorporación del controlador de la cuenta

En el proyecto de Visual Studio, haga clic con el botón derecho en la carpeta Controllers y agregue un nuevo controlador. Seleccione Controlador de MVC en blanco y, luego, proporcione el nombre MyAccountController.cs.

El siguiente fragmento de código muestra un MyAccountController personalizado 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">

Pasar el identificador de la directiva de Azure AD B2C

El siguiente fragmento de código muestra un MyAccountController personalizado 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 la 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 valor asp-controller a MyAccountController para cualquier otro vínculo de autenticación, como registrarse o editar perfil.

Pasar parámetros personalizados

El siguiente fragmento de código muestra un MyAccountController personalizado 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 Compatibilidad con escenarios avanzados y, a continuación, en el método OnRedirectToIdentityProvider, 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, se redirige al usuario al URI especificado en el parámetro post_logout_redirect_uri, independientemente de las direcciones URL de respuesta que se hayan especificado para la aplicación. Sin embargo, si se pasa un valor de id_token_hint válido y la opción Requerir token de identificador en solicitudes de cierre de sesión está activada, Azure AD B2C comprueba que el valor de post_logout_redirect_uri coincida con uno de los URI de redirección configurados de la aplicación antes de realizar la redirección. 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 que la aplicación admita un redireccionamiento de cierre de sesión, primero siga los pasos que se indican en las secciones Controlador de la cuenta y Compatibilidad con escenarios avanzados. A continuación, realice los pasos que se indican a continuación:

  1. En el controlador MyAccountController.cs, 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 valor id_token_hint y anexe el valor a la solicitud de autenticación. El fragmento de código siguiente muestra cómo pasar el valor id_token_hint 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 función ConfigureServices, agregue la opción SaveTokens para que los controladores tengan acceso al valor id_token:

    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 al identificador URI de redireccionamiento de cierre de sesión a la clave SignedOutCallbackPath.

    "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 elemento 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 aplicación.

Control de acceso basado en rol

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

En el método ConfigureServices, agregue el método AddAuthorization, que agrega el modelo de autorización. En el ejemplo siguiente se crea una directiva llamada EmployeeOnly. La directiva comprueba que 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"));
    });

Usted controla la autorización en ASP.NET Core con AuthorizeAttribute y sus distintos parámetros. En su forma más básica, aplicar el atributo Authorize a un controlador, una acción o una Razor Page limita el acceso para los usuarios autenticados de ese componente.

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

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

Pasos siguientes