Condividi tramite


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

Importante

A partire dal 1° maggio 2025, Azure AD B2C non sarà più disponibile per l'acquisto per i nuovi clienti. Altre informazioni sono disponibili nelle domande frequenti.

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 fileappsettings.json eseguire le operazioni seguenti:

  • Aggiornare la Instance voce con il dominio personalizzato.
  • Aggiornare la voce con Domain 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 di 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.

Prepopolare 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 precompilare il nome di accesso, eseguire le operazioni seguenti:

  1. Se stai usando una polizza personalizzata, aggiungere l'attestazione di input richiesta, 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);
    }
    

Preselezionare un fornitore di identità

Se è stato configurato il percorso di accesso per l'applicazione per includere account di social networking, ad esempio Facebook, LinkedIn o Google, è possibile specificare il domain_hint parametro . Questo parametro di query fornisce un suggerimento ad Azure AD B2C sul provider di identità social che dovrebbe 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. Controlla 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 personalizzato della stringa di query

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

Fornire un suggerimento 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 suggerimento sull'utente o sulla 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 tuoi criteri personalizzati, definisci un profilo tecnico del suggerimento del 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 account

Per personalizzare le azioni SignIn, SignUp o SignOut , è consigliabile creare un controller personalizzato. La presenza di 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 trovarne l'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 dei criteri 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);
}

Assicurati di proteggere il reindirizzamento del logout

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 post_logout_redirect_uri corrisponda a uno degli URI di reindirizzamento configurati dell'applicazione prima di 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 di tutto la procedura descritta nelle sezioni Account Controller 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 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 configurazioneappsettings.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 nella 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. Nella forma più semplice, l'applicazione dell'attributo Authorize a un controller, un'azione o una pagina Razor limita l'accesso agli utenti autenticati del 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