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'ID
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 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:
Se si usa un criterio personalizzato, aggiungere l'attestazione di input necessaria, come descritto in Configurare l'accesso diretto.
Completare la procedura Scenari avanzati di supporto .
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:
Controllare il nome di dominio del provider di identità esterno. Per altre informazioni, vedere Reindirizzare l'accesso a un provider di social networking.
Completare la procedura Scenari avanzati di supporto .
OnRedirectToIdentityProviderFunc
Nella funzione aggiungere la riga di codice seguente allaOnRedirectToIdentityProvider
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:
Completare la procedura Scenari avanzati di supporto .
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:
Configurare l'elemento ContentDefinitionParameters .
Completare la procedura Scenari avanzati di supporto .
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:
Completare la procedura Scenari avanzati di supporto .
Nei criteri personalizzati definire un profilo tecnico dell'hint per il token ID.
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:
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); }
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 ilid_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); }
ConfigureServices
Nella funzione aggiungere l'opzioneSaveTokens
per Controller di avere accesso alid_token
valore :services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(options => { Configuration.Bind("AzureAdB2C", options); options.Events ??= new OpenIdConnectEvents(); options.Events.OnRedirectToIdentityProviderForSignOut += OnRedirectToIdentityProviderForSignOutFunc; options.SaveTokens = true; });
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:
- Autorizzazione basata sui ruoli
- Autorizzazione basata sulle attestazioni
- Autorizzazione basata sui criteri
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
- Per altre informazioni sull'autorizzazione, vedere Introduzione all'autorizzazione in ASP.NET Core.