Aktivieren von Authentifizierungsoptionen in einer Web-App mit Azure AD B2C
In diesem Artikel werden die Möglichkeiten beschrieben, wie Sie die Authentifizierungsfunktionalität von Azure Active Directory B2C (Azure AD B2C) für Ihre Webanwendung aktivieren, anpassen und verbessern können.
Bevor Sie beginnen, sollten Sie sich mit den folgenden Artikeln vertraut machen:
- Konfigurieren der Authentifizierung in einer Beispiel-Web-App
- Aktivieren Sie die Authentifizierung in Ihrer eigenen Web-App.
Verwenden einer benutzerdefinierten Domäne
Durch Verwenden einer benutzerdefinierten Domäne können Sie die Authentifizierungs-URL vollständig mit Branding versehen. Aus seiner Sicht bleibt der Benutzer während des Authentifizierungsprozesses in Ihrer Domäne und wird nicht zum Azure AD B2C-Domänennamen b2clogin.com umgeleitet.
Um alle Verweise auf „b2c“ in der URL zu entfernen, können Sie auch den Namen Ihres B2C-Mandanten, contoso.onmicrosoft.com, in der URL der Authentifizierungsanforderung durch die GUID Ihrer Mandanten-ID ersetzen. Sie können z. B. https://fabrikamb2c.b2clogin.com/contoso.onmicrosoft.com/
in https://account.contosobank.co.uk/<tenant ID GUID>/
ändern.
Um eine benutzerdefinierte Domäne und Ihre Mandanten-ID in der Authentifizierungs-URL zu verwenden, befolgen Sie die Anleitung unter Aktivieren von benutzerdefinierten Domänen. Öffnen Sie die Datei appsettings.json in dem Projektstammordner. Diese Datei enthält Informationen zu Ihrem Azure AD B2C-Identitätsanbieter.
Öffnen Sie die Datei appsettings.json, und führen Sie folgende Aktionen aus:
- Aktualisieren Sie den
Instance
-Eintrag mit Ihrer benutzerdefinierten Domäne. - Aktualisieren Sie den
Domain
-Eintrag mit Ihrer Mandanten-ID. Weitere Informationen finden Sie unter Verwenden der Mandanten-ID.
Die folgende JSON zeigt die App-Einstellungen vor der Änderung:
"AzureAdB2C": {
"Instance": "https://contoso.b2clogin.com",
"Domain": "tenant-name.onmicrosoft.com",
...
}
Die folgende JSON zeigt die App-Einstellungen nach der Änderung:
"AzureAdB2C": {
"Instance": "https://login.contoso.com",
"Domain": "00000000-0000-0000-0000-000000000000",
...
}
Die Unterstützung für erweiterte Szenarien
Die AddMicrosoftIdentityWebAppAuthentication
-Methode in der Microsoft Identity Platform-API ermöglicht es den Entwicklern, einen Code für erweiterte Authentifizierungsszenarien hinzuzufügen oder OpenIdConnect-Ereignisse zu abonnieren. Beispielsweise können Sie „OnRedirectToIdentityProvider“ abonnieren, mit dem Sie die Authentifizierungsanforderung anpassen können, die Ihre App an Azure AD B2C sendet.
Um erweiterte Szenarien zu unterstützen, öffnen Sie die Datei Startup.cs und ersetzen Sie AddMicrosoftIdentityWebAppAuthentication
in der ConfigureServices
-Funktion durch den folgenden Codeausschnitt:
// 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;
});
Der vorangehende Code fügt das OnRedirectToIdentityProvider-Ereignis mit einem Verweis auf die Methode OnRedirectToIdentityProviderFunc
hinzu. Fügen Sie den folgenden Codeausschnitt zu der Startup.cs
-Klasse hinzu.
private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
{
// Custom code here
// Don't remove this line
await Task.CompletedTask.ConfigureAwait(false);
}
Sie können die Parameter zwischen Ihrem Controller und der Funktion OnRedirectToIdentityProvider
mithilfe von Kontextparametern übergeben.
Auffüllen des Anmeldenamens
Während einer User Journey zur Anmeldung zielt Ihre App ggf. auf einen bestimmten Benutzer ab. Wenn eine App auf einen Benutzer abzielt, kann sie in der Autorisierungsanforderung den Abfrageparameter login_hint
mit dem Anmeldenamen des Benutzers angeben. Azure AD B2C füllt den Anmeldenamen automatisch auf. Der Benutzer muss nur das Kennwort angeben.
Gehen Sie wie folgt vor, um den Anmeldenamen vorab aufzufüllen:
Wenn Sie eine benutzerdefinierte Richtlinie verwenden, fügen Sie den erforderlichen Eingabeanspruch hinzu, wie unter dem Verfahren Einrichten der direkten Anmeldung beschrieben.
Schließen Sie das Verfahren Unterstützen erweiterter Szenarien ab.
Fügen Sie der
OnRedirectToIdentityProvider
-Funktion die folgende Codezeile hinzu:private async Task OnRedirectToIdentityProviderFunc(RedirectContext context) { context.ProtocolMessage.LoginHint = "emily@contoso.com"; // More code await Task.CompletedTask.ConfigureAwait(false); }
Vorabauswahl eines Identitätsanbieters
Wenn Sie die User Journey für die Anmeldung bei Ihrer Anwendung so konfiguriert haben, dass Konten für soziale Netzwerke inbegriffen sind, wie z.B. Facebook, LinkedIn oder Google, können Sie den Parameter domain_hint
angeben. Dieser Abfrageparameter enthält einen Hinweis für Azure AD B2C zu dem sozialen Netzwerk als Identitätsanbieter, das für die Anmeldung verwendet werden sollte. Wenn in der Anwendung beispielsweise domain_hint=facebook.com
angegeben ist, erfolgt der Anmeldefluss direkt auf der Anmeldeseite von Facebook.
Gehen Sie wie folgt vor, um Benutzer zu einem externen Identitätsanbieter umzuleiten:
Überprüfen Sie den Domänennamen Ihres externen Identitätsanbieters. Weitere Informationen finden Sie unter Umleiten einer Anmeldung zu einem Anbieter sozialer Netzwerke.
Schließen Sie das Verfahren Unterstützen erweiterter Szenarien ab.
Fügen Sie in der Funktion
OnRedirectToIdentityProviderFunc
die folgende Codezeile zurOnRedirectToIdentityProvider
-Funktion hinzu:private async Task OnRedirectToIdentityProviderFunc(RedirectContext context) { context.ProtocolMessage.DomainHint = "facebook.com"; // More code await Task.CompletedTask.ConfigureAwait(false); }
Ändern Sie die Sprache für die Benutzeroberfläche
Die Sprachanpassung in Azure AD B2C ermöglicht Ihrem Benutzerfluss, eine Vielzahl von Sprachen zu berücksichtigen, um die Anforderungen Ihrer Kunden zu erfüllen. Weitere Informationen hierzu finden Sie unter Sprachanpassung.
Gehen Sie wie folgt vor, um die bevorzugte Sprache festzulegen:
Schließen Sie das Verfahren Unterstützen erweiterter Szenarien ab.
Fügen Sie der
OnRedirectToIdentityProvider
-Funktion die folgende Codezeile hinzu:private async Task OnRedirectToIdentityProviderFunc(RedirectContext context) { context.ProtocolMessage.UiLocales = "es"; // More code await Task.CompletedTask.ConfigureAwait(false); }
Das Übergeben eines benutzerdefinierten Abfragezeichenfolgenparameters
Mit benutzerdefinierten Richtlinien können Sie einen benutzerdefinierten Abfragezeichenfolgenparameter übergeben. Ein gutes Anwendungsfallbeispiel ist die dynamische Änderung der Seitenanzahl.
Um einen benutzerdefinierten Abfragezeichenfolgenparameter zu übergeben, gehen Sie folgendermaßen vor:
Konfigurieren Sie das ContentDefinitionParameters-Element.
Schließen Sie das Verfahren Unterstützen erweiterter Szenarien ab.
Fügen Sie der
OnRedirectToIdentityProvider
-Funktion die folgende Codezeile hinzu:private async Task OnRedirectToIdentityProviderFunc(RedirectContext context) { context.ProtocolMessage.Parameters.Add("campaignId", "123"); // More code await Task.CompletedTask.ConfigureAwait(false); }
Übergeben eines ID-Tokenhinweises
Eine Anwendung der vertrauenden Seite kann ein eingehendes JWT (JSON Web Token) als Teil der OAuth2-Autorisierungsanforderung senden. Das eingehende Token ist ein Hinweis zum Benutzer oder zur Autorisierungsanforderung. Azure AD B2C überprüft das Token und extrahiert die Ansprüche.
Führen Sie die folgenden Schritte aus, um einen ID-Tokenhinweis in die Authentifizierungsanforderung einzufügen:
Schließen Sie das Verfahren Unterstützen erweiterter Szenarien ab.
Definieren Sie ein technisches ID-Token-Hinweisprofil in Ihrer benutzerdefinierten Richtlinie.
Fügen Sie der
OnRedirectToIdentityProvider
-Funktion die folgende Codezeile hinzu:private async Task OnRedirectToIdentityProviderFunc(RedirectContext context) { // The idTokenHint variable holds your ID token context.ProtocolMessage.IdTokenHint = idTokenHint // More code await Task.CompletedTask.ConfigureAwait(false); }
Der Konto-Controller
Wenn Sie die Aktionen Anmelden, Registrieren oder Abmelden anpassen möchten, wird empfohlen, dass Sie einen eigenen Controller erstellen. Mit einem eigenen Controller können Sie die Parameter zwischen Ihrem Controller und der Authentifizierungsbibliothek übergeben.
AccountController
ist Teil des Microsoft.Identity.Web.UI
NuGet-Pakets, das die Anmelde- und Abmeldeaktionen verarbeitet. Die Implementierung dafür finden Sie in der Microsoft Identity Web-Bibliothek.
Hinzufügen des Kontocontrollers
Klicken Sie im Visual Studio-Projekt mit der rechten Maustaste auf den Ordner Controller, und fügen Sie dann einen neuen Controller hinzu. Wählen Sie Leerer MVC-Controller aus, und geben Sie dann den Namen MyAccountController.cs an.
Der folgende Codeausschnitt veranschaulicht eine benutzerdefinierte MyAccountController
mit der SignIn-Aktion.
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);
}
}
}
Ändern Sie in der _LoginPartial.cshtml-Ansicht den Anmeldelink zu Ihrem Controller.
<form method="get" asp-area="MicrosoftIdentity" asp-controller="MyAccount" asp-action="SignIn">
Übergeben der Azure AD B2C-Richtlinien-ID
Der folgende Codeausschnitt veranschaulicht einen benutzerdefinierten MyAccountController
mit den Aktionen SignIn und SignUp. Die Aktion übergibt einen Parameter namens policy
an die Authentifizierungsbibliothek. Dadurch können Sie die richtige Azure AD B2C-Richtlinien-ID für die jeweilige Aktion angeben.
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);
}
Ändern Sie in der Ansicht _LoginPartial.cshtml für alle anderen Authentifizierungslinks den asp-controller
-Wert in MyAccountController
(z. B. für die Registrierung oder die Profilbearbeitung).
Übergeben benutzerdefinierter Parameter
Der folgende Codeausschnitt veranschaulicht eine benutzerdefinierte MyAccountController
mit der SignIn-Aktion. Die Aktion übergibt einen Parameter namens campaign_id
an die Authentifizierungsbibliothek.
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);
}
Schließen Sie das Verfahren Erweiterte Szenarien unterstützen aus, und lesen Sie dann in der OnRedirectToIdentityProvider
Methode den benutzerdefinierten Parameter:
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);
}
Sichern der Umleitung beim Abmelden
Nach der Abmeldung wird der Benutzer an den im post_logout_redirect_uri
-Parameter angegebenen URI umgeleitet, ungeachtet der Antwort-URLs, die für die Anwendung angegeben wurden. Wenn jedoch ein gültiger id_token_hint
-Wert übergeben wird und die Option ID-Token in Abmeldeanforderungen erforderlich aktiviert ist, überprüft Azure AD B2C, ob der Wert von post_logout_redirect_uri
einem der für die Anwendung konfigurierten Umleitungs-URIs entspricht, bevor die Umleitung ausgeführt wird. Wenn keine entsprechende Antwort-URL für die Anwendung konfiguriert ist, wird eine Fehlermeldung angezeigt, und der Benutzer wird nicht umgeleitet.
Um eine sichere Umleitung der Abmeldung von Ihrer Anwendung zu unterstützen, führen Sie zunächst die Schritte in den Abschnitten Kontocontroller und Unterstützung erweiterter Szenarien aus. Führen Sie danach die folgenden Schritte aus:
Fügen Sie im Controller
MyAccountController.cs
mithilfe des folgenden Codeausschnitts eine SignOut-Aktion hinzu:[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); }
Analysieren Sie in der Klasse Startup.cs den Wert von
id_token_hint
, und fügen Sie den Wert an die Authentifizierungsanforderung an. Der folgende Codeausschnitt veranschaulicht das Übergeben des Werts vonid_token_hint
an die Authentifizierungsanforderung: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); }
Fügen Sie in der
ConfigureServices
-Funktion die OptionSaveTokens
hinzu, damit Controller Zugriff auf denid_token
-Wert erhalten:services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(options => { Configuration.Bind("AzureAdB2C", options); options.Events ??= new OpenIdConnectEvents(); options.Events.OnRedirectToIdentityProviderForSignOut += OnRedirectToIdentityProviderForSignOutFunc; options.SaveTokens = true; });
Fügen Sie in der Konfigurationsdatei appsettings.json im Schlüssel
SignedOutCallbackPath
Ihren Umleitungs-URI-Pfad für die Abmeldung hinzu."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>" }
Im obigen Beispiel weist post_logout_redirect_uri, das an die Abmeldeanforderung übergeben wird, das folgende Format auf: https://your-app.com/signout/<your-sign-up-in-policy>
. Diese URL muss zur Antwort-URL der Anwendungsregistrierung hinzugefügt werden.
Rollenbasierte Zugriffssteuerung
Mit Autorisierung in ASP.NET Core können Sie mithilfe einer der folgenden Methoden überprüfen, ob Benutzer für den Zugriff auf eine geschützte Ressource autorisiert sind:
Fügen Sie in der ConfigureServices
-Methode die AddAuthorization
-Methode hinzu, die das Autorisierungsmodell hinzufügt. Im folgenden Beispiel wird eine Richtlinie namens EmployeeOnly
erstellt. Die Richtlinie überprüft, ob ein Anspruch EmployeeNumber
vorhanden ist. Der Wert des Anspruchs muss eine der folgenden IDs sein: 1, 2, 3, 4 oder 5.
services.AddAuthorization(options =>
{
options.AddPolicy("EmployeeOnly", policy =>
policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
});
Sie steuern die Autorisierung in ASP.NET Core mit dem AuthorizeAttribute und dessen verschiedenen Parametern. In seiner grundlegendsten Form schränkt das Anwenden des Authorize
-Attributs auf einen Controller, eine Aktion oder eine Razor-Seite den Zugriff auf die authentifizierten Benutzer dieser Komponente ein.
Die Richtlinien werden von Ihnen auf die Controller angewendet, indem das Authorize
-Attribut mit dem Richtliniennamen verwendet wird. Der folgende Code schränkt den Zugriff auf die Claims
-Aktion auf die Benutzer ein, die durch die EmployeeOnly
-Richtlinie autorisiert sind:
[Authorize(Policy = "EmployeeOnly")]
public IActionResult Claims()
{
return View();
}
Nächste Schritte
- Weitere Informationen zur Autorisierung finden Sie unter Einführung in die Autorisierung in ASP.NET Core.