Udostępnij za pośrednictwem


Włączanie opcji uwierzytelniania w aplikacji internetowej przy użyciu Azure AD B2C

W tym artykule opisano sposób włączania, dostosowywania i ulepszania środowiska uwierzytelniania usługi Azure Active Directory B2C (Azure AD B2C) dla aplikacji internetowej.

Przed rozpoczęciem należy zapoznać się z następującymi artykułami:

Korzystanie z domeny niestandardowej

Za pomocą domeny niestandardowej można w pełni oznaczyć adres URL uwierzytelniania. Z perspektywy użytkownika użytkownicy pozostają w domenie podczas procesu uwierzytelniania, a nie są przekierowywani do Azure AD B2C b2clogin.com nazwy domeny.

Aby usunąć wszystkie odwołania do "b2c" w adresie URL, możesz również zastąpić nazwę dzierżawy B2C, contoso.onmicrosoft.com, w adresIE URL żądania uwierzytelniania identyfikatorem GUID dzierżawy. Możesz na przykład zmienić wartość https://fabrikamb2c.b2clogin.com/contoso.onmicrosoft.com/ na https://account.contosobank.co.uk/<tenant ID GUID>/.

Aby użyć domeny niestandardowej i identyfikatora dzierżawy w adresie URL uwierzytelniania, postępuj zgodnie ze wskazówkami w temacie Włączanie domen niestandardowych. W folderze głównym projektu otwórz plik appsettings.json . Ten plik zawiera informacje o dostawcy tożsamości usługi Azure AD B2C.

W pliku appsettings.json wykonaj następujące czynności:

Poniższy kod JSON pokazuje ustawienia aplikacji przed zmianą:

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

Poniższy kod JSON pokazuje ustawienia aplikacji po zmianie:

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

Obsługa zaawansowanych scenariuszy

Metoda AddMicrosoftIdentityWebAppAuthentication w interfejsie API Platforma tożsamości Microsoft umożliwia deweloperom dodawanie kodu dla zaawansowanych scenariuszy uwierzytelniania lub subskrybowanie zdarzeń OpenIdConnect. Możesz na przykład zasubskrybować element OnRedirectToIdentityProvider, który umożliwia dostosowanie żądania uwierzytelniania wysyłanego przez aplikację do Azure AD B2C.

Aby obsługiwać zaawansowane scenariusze, otwórz plik Startup.cs i w ConfigureServices funkcji zastąp AddMicrosoftIdentityWebAppAuthentication element następującym fragmentem kodu:

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

Powyższy kod dodaje zdarzenie OnRedirectToIdentityProvider z odwołaniem do OnRedirectToIdentityProviderFunc metody . Dodaj następujący fragment kodu do Startup.cs klasy .

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

Parametry między kontrolerem i funkcją OnRedirectToIdentityProvider można przekazać przy użyciu parametrów kontekstu.

Wstępnie wypełnij nazwę logowania

Podczas podróży użytkownika logowania aplikacja może być skierowana do określonego użytkownika. Gdy aplikacja jest przeznaczona dla użytkownika, może określić w żądaniu login_hint autoryzacji parametr zapytania z nazwą logowania użytkownika. Azure AD B2C automatycznie wypełnia nazwę logowania, a użytkownik musi podać tylko hasło.

Aby wstępnie wypełniać nazwę logowania, wykonaj następujące czynności:

  1. Jeśli używasz zasad niestandardowych, dodaj wymagane oświadczenie wejściowe zgodnie z opisem w temacie Konfigurowanie logowania bezpośredniego.

  2. Ukończ procedurę Zaawansowane scenariusze pomocy technicznej .

  3. Dodaj następujący wiersz kodu do OnRedirectToIdentityProvider funkcji :

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

Wstępne wybieranie dostawcy tożsamości

Jeśli skonfigurowano logowanie dla aplikacji tak, aby obejmowała konta społecznościowe, takie jak Facebook, LinkedIn lub Google, możesz określić domain_hint parametr . Ten parametr zapytania zawiera wskazówkę dla Azure AD B2C o dostawcy tożsamości społecznościowych, który powinien być używany do logowania. Jeśli na przykład aplikacja określa domain_hint=facebook.comwartość , przepływ logowania przechodzi bezpośrednio do strony logowania w serwisie Facebook.

Aby przekierować użytkowników do zewnętrznego dostawcy tożsamości, wykonaj następujące czynności:

  1. Sprawdź nazwę domeny zewnętrznego dostawcy tożsamości. Aby uzyskać więcej informacji, zobacz Przekierowywanie logowania do dostawcy społecznościowego.

  2. Ukończ procedurę Zaawansowane scenariusze pomocy technicznej .

  3. OnRedirectToIdentityProviderFunc W funkcji dodaj następujący wiersz kodu do OnRedirectToIdentityProvider funkcji :

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

Określanie języka interfejsu użytkownika

Dostosowywanie języka w usłudze Azure AD B2C umożliwia przepływowi użytkownika dostosowanie różnych języków do potrzeb klientów. Aby uzyskać więcej informacji, zobacz Dostosowywanie języka.

Aby ustawić preferowany język, wykonaj następujące czynności:

  1. Konfigurowanie dostosowywania języka.

  2. Ukończ procedurę Zaawansowane scenariusze pomocy technicznej .

  3. Dodaj następujący wiersz kodu do OnRedirectToIdentityProvider funkcji :

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

Przekazywanie niestandardowego parametru ciągu zapytania

Za pomocą zasad niestandardowych można przekazać niestandardowy parametr ciągu zapytania. Dobrym przykładem przypadku użycia jest dynamiczna zmiana zawartości strony.

Aby przekazać niestandardowy parametr ciągu zapytania, wykonaj następujące czynności:

  1. Skonfiguruj element ContentDefinitionParameters .

  2. Ukończ procedurę Zaawansowane scenariusze pomocy technicznej .

  3. Dodaj następujący wiersz kodu do OnRedirectToIdentityProvider funkcji :

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

Przekazywanie wskazówki dotyczącej tokenu identyfikatora

Aplikacja jednostki uzależnionej może wysyłać przychodzący token internetowy JSON (JWT) w ramach żądania autoryzacji OAuth2. Token przychodzący to wskazówka dotycząca użytkownika lub żądania autoryzacji. Azure AD B2C weryfikuje token, a następnie wyodrębnia oświadczenie.

Aby uwzględnić wskazówkę tokenu identyfikatora w żądaniu uwierzytelniania, wykonaj następujące czynności:

  1. Ukończ procedurę Zaawansowane scenariusze pomocy technicznej .

  2. W zasadach niestandardowych zdefiniuj profil techniczny wskazówki dotyczącej tokenu identyfikatora.

  3. Dodaj następujący wiersz kodu do OnRedirectToIdentityProvider funkcji :

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

Kontroler konta

Jeśli chcesz dostosować akcje SignIn, SignUp lub SignOut , zachęcamy do utworzenia własnego kontrolera. Posiadanie własnego kontrolera umożliwia przekazywanie parametrów między kontrolerem a biblioteką uwierzytelniania. AccountController jest częścią Microsoft.Identity.Web.UI pakietu NuGet, który obsługuje akcje logowania i wylogowywanie. Implementację można znaleźć w bibliotece sieci Web tożsamości firmy Microsoft.

Dodawanie kontrolera konta

W projekcie programu Visual Studio kliknij prawym przyciskiem myszy folder Controllers , a następnie dodaj nowy kontroler. Wybierz pozycję MVC — pusty kontroler, a następnie podaj nazwę MyAccountController.cs.

Poniższy fragment kodu przedstawia niestandardowy kod MyAccountController z akcją 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);
        }

    }
}

W widoku _LoginPartial.cshtml zmień link logowania do kontrolera.

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

Przekazywanie identyfikatora zasad usługi Azure AD B2C

Poniższy fragment kodu przedstawia niestandardowy kod MyAccountController z akcją SignIn i SignUp . Akcja przekazuje parametr o nazwie policy do biblioteki uwierzytelniania. Dzięki temu można podać prawidłowy identyfikator zasad Azure AD B2C dla konkretnej akcji.

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

W widoku _LoginPartial.cshtml zmień asp-controller wartość na MyAccountController dla innych linków uwierzytelniania, takich jak rejestracja lub edytowanie profilu.

Przekazywanie parametrów niestandardowych

Poniższy fragment kodu przedstawia niestandardowy kod MyAccountController z akcją SignIn . Akcja przekazuje parametr o nazwie campaign_id do biblioteki uwierzytelniania.

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

Ukończ procedurę Zaawansowane scenariusze obsługi , a następnie w metodzie odczytaj OnRedirectToIdentityProvider parametr niestandardowy:

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

Zabezpieczanie przekierowania wylogowywanie

Po wylogowaniu użytkownik jest przekierowywany do identyfikatora URI określonego w parametrze post_logout_redirect_uri , niezależnie od adresów URL odpowiedzi, które zostały określone dla aplikacji. Jeśli jednak przekazano prawidłową wartość id_token_hint i jest włączona pozycja Wymagaj tokenu identyfikatora w żądaniach wylogowywanie, Azure AD B2C sprawdza, czy wartość post_logout_redirect_uri jest zgodna z jedną ze skonfigurowanych identyfikatorów URI przekierowania aplikacji przed wykonaniem przekierowania. Jeśli dla aplikacji nie skonfigurowano pasującego adresu URL odpowiedzi, zostanie wyświetlony komunikat o błędzie i użytkownik nie zostanie przekierowany.

Aby zapewnić obsługę bezpiecznego przekierowania wylogowywanie w aplikacji, najpierw wykonaj kroki opisane w sekcjach Kontroler konta i Zaawansowane scenariusze pomocy technicznej . Następnie wykonaj poniższe kroki:

  1. Na MyAccountController.cs kontrolerze dodaj akcję SignOut przy użyciu następującego fragmentu kodu:

    [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. W klasie Startup.cs przeanalizuj id_token_hint wartość i dołącz wartość do żądania uwierzytelniania. Poniższy fragment kodu pokazuje, jak przekazać id_token_hint wartość do żądania uwierzytelniania:

    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 W funkcji dodaj SaveTokens opcję Kontrolery mają dostęp do id_token wartości :

    services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(options =>
        {
            Configuration.Bind("AzureAdB2C", options);
            options.Events ??= new OpenIdConnectEvents();        
            options.Events.OnRedirectToIdentityProviderForSignOut += OnRedirectToIdentityProviderForSignOutFunc;
            options.SaveTokens = true;
        });
    
  4. W pliku konfiguracji appsettings.json dodaj ścieżkę identyfikatora URI przekierowania wyloguj się z SignedOutCallbackPath kluczem.

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

W powyższym przykładzie post_logout_redirect_uri przekazane do żądania wylogowywanie będzie mieć format: https://your-app.com/signout/<your-sign-up-in-policy>. Ten adres URL należy dodać do adresu URL odpowiedzi rejestracji aplikacji.

Kontrola dostępu oparta na rolach

Przy użyciu autoryzacji w ASP.NET Core można sprawdzić, czy użytkownicy mają autoryzację dostępu do chronionego zasobu przy użyciu jednej z następujących metod:

W metodzie ConfigureServices dodaj metodę AddAuthorization , która dodaje model autoryzacji. Poniższy przykład tworzy zasady o nazwie EmployeeOnly. Zasady sprawdzają, czy oświadczenie EmployeeNumber istnieje. Wartość oświadczenia musi być jednym z następujących identyfikatorów: 1, 2, 3, 4 lub 5.

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

Autoryzacja w ASP.NET Core jest sterowana przy użyciu atrybutu AuthorizeAttribute i jego różnych parametrów. W najbardziej podstawowej formie zastosowanie atrybutu Authorize do kontrolera, akcji lub strony Razor ogranicza dostęp do uwierzytelnionych użytkowników tego składnika.

Zasady są stosowane do kontrolerów przy użyciu atrybutu Authorize z nazwą zasad. Poniższy kod ogranicza dostęp do Claims akcji użytkownikom autoryzowanym EmployeeOnly przez zasady:

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

Następne kroki