Condividi tramite


Abilitare le opzioni di autenticazione in un'app Web usando Azure AD B2C

Questo articolo descrive come abilitare, personalizzare e migliorare l'esperienza di autenticazione di Azure Active Directory B2C (Azure AD B2C) per l'applicazione Web.

Prima di iniziare, è importante acquisire familiarità con gli articoli seguenti:

Usare un dominio personalizzato

Usando un dominio personalizzato, è possibile personalizzare completamente l'URL di autenticazione. Dal punto di vista dell'utente, gli utenti rimangono nel dominio durante il processo di autenticazione, anziché essere reindirizzati al nome di dominio di Azure AD B2C b2clogin.com.

Per rimuovere tutti i riferimenti a "b2c" nell'URL, è anche possibile sostituire il nome del tenant B2C, contoso.onmicrosoft.com, nell'URL della richiesta di autenticazione con il GUID dell'ID tenant. Ad esempio, è possibile passare https://fabrikamb2c.b2clogin.com/contoso.onmicrosoft.com/ a https://account.contosobank.co.uk/<tenant ID GUID>/.

Per usare un dominio personalizzato e l'ID tenant nell'URL di autenticazione, seguire le indicazioni in Abilitare domini personalizzati. Nella cartella radice del progetto aprire il file appsettings.json . Questo file contiene informazioni sul provider di identità di Azure AD B2C.

Nel file appsettings.json eseguire le operazioni seguenti:

  • Aggiornare la Instance voce con il dominio personalizzato.
  • Aggiornare la voce con l'IDDomain tenant. Per altre informazioni, vedere Usare l'ID tenant.

Il codice JSON seguente mostra le impostazioni dell'app prima della modifica:

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

Il codice JSON seguente mostra le impostazioni dell'app dopo la modifica:

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

Supportare scenari avanzati

Il AddMicrosoftIdentityWebAppAuthentication metodo nell'API Microsoft Identity Platform consente agli sviluppatori di aggiungere codice per scenari di autenticazione avanzati o sottoscrivere eventi OpenIdConnect. Ad esempio, è possibile sottoscrivere OnRedirectToIdentityProvider, che consente di personalizzare la richiesta di autenticazione inviata dall'app ad Azure AD B2C.

Per supportare scenari avanzati, aprire il file Startup.cs e, nella ConfigureServices funzione, sostituire AddMicrosoftIdentityWebAppAuthentication con il frammento di codice seguente:

// 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;
});

Il codice precedente aggiunge l'evento OnRedirectToIdentityProvider con un riferimento al OnRedirectToIdentityProviderFunc metodo . Aggiungere il frammento di codice seguente alla Startup.cs classe .

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

È possibile passare parametri tra il controller e la OnRedirectToIdentityProvider funzione usando i parametri di contesto.

Precompilare il nome di accesso

Durante un percorso utente di accesso, l'app potrebbe avere come destinazione un utente specifico. Quando un'app è destinata a un utente, può specificare nella richiesta di autorizzazione il login_hint parametro di query con il nome di accesso dell'utente. Azure AD B2C popola automaticamente il nome di accesso e l'utente deve fornire solo la password.

Per prepopopolare il nome di accesso, eseguire le operazioni seguenti:

  1. Se si usa un criterio personalizzato, aggiungere l'attestazione di input necessaria, come descritto in Configurare l'accesso diretto.

  2. Completare la procedura Scenari avanzati di supporto .

  3. Aggiungere la riga di codice seguente alla OnRedirectToIdentityProvider funzione :

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

Pre-selezionare un provider di identità

Se la procedura di accesso per l'applicazione è stata configurata per includere gli account di social networking, ad esempio Facebook, LinkedIn o Google, è possibile specificare il parametro domain_hint. Questo parametro di query fornisce un hint ad Azure AD B2C sul provider di identità di social networking che deve essere usato per l'accesso. Ad esempio, se l'applicazione specifica domain_hint=facebook.com, il flusso di accesso passa direttamente alla pagina di accesso di Facebook.

Per reindirizzare gli utenti a un provider di identità esterno, eseguire le operazioni seguenti:

  1. Controllare il nome di dominio del provider di identità esterno. Per altre informazioni, vedere Reindirizzare l'accesso a un provider di social networking.

  2. Completare la procedura Scenari avanzati di supporto .

  3. OnRedirectToIdentityProviderFunc Nella funzione aggiungere la riga di codice seguente alla OnRedirectToIdentityProvider funzione :

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

Specificare la lingua dell'interfaccia utente

La personalizzazione della lingua in Azure AD B2C consente al flusso utente di soddisfare diverse lingue in base alle esigenze dei clienti. Per altre informazioni, vedere Personalizzazione della lingua.

Per impostare la lingua preferita, eseguire le operazioni seguenti:

  1. Configurare la personalizzazione della lingua.

  2. Completare la procedura Scenari avanzati di supporto .

  3. Aggiungere la riga di codice seguente alla OnRedirectToIdentityProvider funzione :

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

Passare un parametro di stringa di query personalizzato

Con i criteri personalizzati, è possibile passare un parametro di stringa di query personalizzato. Un buon esempio di caso d'uso è quando si vuole modificare dinamicamente il contenuto della pagina.

Per passare un parametro di stringa di query personalizzato, eseguire le operazioni seguenti:

  1. Configurare l'elemento ContentDefinitionParameters .

  2. Completare la procedura Scenari avanzati di supporto .

  3. Aggiungere la riga di codice seguente alla OnRedirectToIdentityProvider funzione :

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

Passare un hint per il token ID

Un'applicazione relying party può inviare un token JSON Web (JWT) in ingresso come parte della richiesta di autorizzazione OAuth2. Il token in ingresso è un hint per l'utente o la richiesta di autorizzazione. Azure AD B2C convalida il token e quindi estrae l'attestazione.

Per includere un hint per il token ID nella richiesta di autenticazione, eseguire le operazioni seguenti:

  1. Completare la procedura Scenari avanzati di supporto .

  2. Nei criteri personalizzati definire un profilo tecnico dell'hint per il token ID.

  3. Aggiungere la riga di codice seguente alla OnRedirectToIdentityProvider funzione :

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

Controller dell'account

Per personalizzare le azioni SignIn, SignUp o SignOut , è consigliabile creare un controller personalizzato. Avere un controller personalizzato consente di passare parametri tra il controller e la libreria di autenticazione. AccountController fa parte del Microsoft.Identity.Web.UI pacchetto NuGet, che gestisce le azioni di accesso e disconnesso. È possibile trovare la relativa implementazione nella libreria Web di Microsoft Identity.

Aggiungere il controller account

Nel progetto di Visual Studio fare clic con il pulsante destro del mouse sulla cartella Controller e quindi aggiungere un nuovo controller. Selezionare MVC - Controller vuoto e quindi specificare il nome MyAccountController.cs.

Il frammento di codice seguente illustra un oggetto personalizzato MyAccountController con l'azione 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);
        }

    }
}

Nella visualizzazione _LoginPartial.cshtml modificare il collegamento di accesso al controller.

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

Passare l'ID criterio di Azure AD B2C

Il frammento di codice seguente illustra un oggetto personalizzato MyAccountController con l'azione SignIn e SignUp . L'azione passa un parametro denominato policy alla libreria di autenticazione. In questo modo è possibile specificare l'ID criterio di Azure AD B2C corretto per l'azione specifica.

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);
}

Nella visualizzazione _LoginPartial.cshtml modificare il asp-controller valore in MyAccountController per tutti gli altri collegamenti di autenticazione, ad esempio l'iscrizione o la modifica del profilo.

Passare parametri personalizzati

Il frammento di codice seguente illustra un oggetto personalizzato MyAccountController con l'azione SignIn . L'azione passa un parametro denominato campaign_id alla libreria di autenticazione.

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);
}

Completare la procedura Support advanced scenarios (Scenari avanzati di supporto ) e quindi, nel OnRedirectToIdentityProvider metodo , leggere il parametro personalizzato:

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);
}

Proteggere il reindirizzamento della disconnessione

Dopo la disconnessione, l'utente viene reindirizzato all'URI specificato nel post_logout_redirect_uri parametro , indipendentemente dagli URL di risposta specificati per l'applicazione. Tuttavia, se viene passato un valore valido id_token_hint e l'opzione Richiedi token ID nelle richieste di disconnessione è attivata, Azure AD B2C verifica che il valore di corrisponda a uno degli URI di reindirizzamento configurati dell'applicazione prima di post_logout_redirect_uri eseguire il reindirizzamento. Se non è stato configurato alcun URL di risposta corrispondente per l'applicazione, viene visualizzato un messaggio di errore e l'utente non viene reindirizzato.

Per supportare un reindirizzamento di disconnessione protetto nell'applicazione, seguire prima la procedura descritta nelle sezioni Controller account e Supporto di scenari avanzati . Seguire quindi la procedura seguente:

  1. Nel MyAccountController.cs controller aggiungere un'azione SignOut usando il frammento di codice seguente:

    [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. Nella classe Startup.cs analizzare il id_token_hint valore e aggiungere il valore alla richiesta di autenticazione. Il frammento di codice seguente illustra come passare il id_token_hint valore alla richiesta di autenticazione:

    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. ConfigureServices Nella funzione aggiungere l'opzione SaveTokens per Controller di avere accesso al id_token valore :

    services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(options =>
        {
            Configuration.Bind("AzureAdB2C", options);
            options.Events ??= new OpenIdConnectEvents();        
            options.Events.OnRedirectToIdentityProviderForSignOut += OnRedirectToIdentityProviderForSignOutFunc;
            options.SaveTokens = true;
        });
    
  4. Nel file di configurazione appsettings.json aggiungere il percorso dell'URI di reindirizzamento disconnessione alla SignedOutCallbackPath chiave.

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

Nell'esempio precedente, il post_logout_redirect_uri passato alla richiesta di disconnessione sarà nel formato : https://your-app.com/signout/<your-sign-up-in-policy>. Questo URL deve essere aggiunto all'URL di risposta della registrazione dell'applicazione.

Controllo degli accessi in base al ruolo

Con l'autorizzazione in ASP.NET Core è possibile verificare se gli utenti sono autorizzati ad accedere a una risorsa protetta usando uno dei metodi seguenti:

ConfigureServices Nel metodo aggiungere il AddAuthorization metodo , che aggiunge il modello di autorizzazione. Nell'esempio seguente viene creato un criterio denominato EmployeeOnly. Il criterio verifica l'esistenza di un'attestazione EmployeeNumber . Il valore dell'attestazione deve essere uno degli ID seguenti: 1, 2, 3, 4 o 5.

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

È possibile controllare l'autorizzazione in ASP.NET Core usando AuthorizeAttribute e i relativi vari parametri. Nel formato più semplice, l'applicazione dell'attributo Authorize a un controller, un'azione o una pagina Razor limita l'accesso agli utenti autenticati di tale componente.

I criteri vengono applicati ai controller usando l'attributo Authorize con il nome del criterio. Il codice seguente limita l'accesso all'azione Claims agli utenti autorizzati dai EmployeeOnly criteri:

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

Passaggi successivi