Freigeben über


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:

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:

  1. Wenn Sie eine benutzerdefinierte Richtlinie verwenden, fügen Sie den erforderlichen Eingabeanspruch hinzu, wie unter dem Verfahren Einrichten der direkten Anmeldung beschrieben.

  2. Schließen Sie das Verfahren Unterstützen erweiterter Szenarien ab.

  3. 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:

  1. Überprüfen Sie den Domänennamen Ihres externen Identitätsanbieters. Weitere Informationen finden Sie unter Umleiten einer Anmeldung zu einem Anbieter sozialer Netzwerke.

  2. Schließen Sie das Verfahren Unterstützen erweiterter Szenarien ab.

  3. Fügen Sie in der Funktion OnRedirectToIdentityProviderFunc die folgende Codezeile zur OnRedirectToIdentityProvider-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:

  1. Konfigurieren Sie die Sprachanpassung.

  2. Schließen Sie das Verfahren Unterstützen erweiterter Szenarien ab.

  3. 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:

  1. Konfigurieren Sie das ContentDefinitionParameters-Element.

  2. Schließen Sie das Verfahren Unterstützen erweiterter Szenarien ab.

  3. 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:

  1. Schließen Sie das Verfahren Unterstützen erweiterter Szenarien ab.

  2. Definieren Sie ein technisches ID-Token-Hinweisprofil in Ihrer benutzerdefinierten Richtlinie.

  3. 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:

  1. 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);
    }
    
  2. 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 von id_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);
    }
    
  3. Fügen Sie in der ConfigureServices-Funktion die Option SaveTokens hinzu, damit Controller Zugriff auf den id_token-Wert erhalten:

    services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(options =>
        {
            Configuration.Bind("AzureAdB2C", options);
            options.Events ??= new OpenIdConnectEvents();        
            options.Events.OnRedirectToIdentityProviderForSignOut += OnRedirectToIdentityProviderForSignOutFunc;
            options.SaveTokens = true;
        });
    
  4. 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