Sdílet prostřednictvím


Povolení možností ověřování ve webové aplikaci pomocí Azure AD B2C

Tento článek popisuje, jak povolit, přizpůsobit a vylepšit prostředí ověřování Azure Active Directory B2C (Azure AD B2C) pro vaši webovou aplikaci.

Než začnete, je důležité se seznámit s následujícími články:

Použití vlastní domény

Pomocí vlastní domény můžete plně označit ověřovací adresu URL. Z pohledu uživatele zůstanou uživatelé během procesu ověřování na vaší doméně, místo aby byli přesměrováni na Azure AD B2C b2clogin.com název domény.

Pokud chcete odebrat všechny odkazy na b2c v adrese URL, můžete také nahradit název tenanta B2C contoso.onmicrosoft.com v adrese URL žádosti o ověření identifikátorem GUID vašeho tenanta. Můžete například změnit https://fabrikamb2c.b2clogin.com/contoso.onmicrosoft.com/ na https://account.contosobank.co.uk/<tenant ID GUID>/.

Pokud chcete v ověřovací adrese URL použít vlastní doménu a ID tenanta, postupujte podle pokynů v tématu Povolení vlastních domén. V kořenové složce projektu otevřete soubor appsettings.json . Tento soubor obsahuje informace o zprostředkovateli identity Azure AD B2C.

V souboru appsettings.json udělejte toto:

  • Instance Aktualizujte položku pomocí vlastní domény.
  • Domain Aktualizujte položku pomocí ID tenanta. Další informace najdete v tématu Použití ID tenanta.

Následující kód JSON zobrazuje nastavení aplikace před změnou:

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

Následující kód JSON zobrazuje nastavení aplikace po změně:

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

Podpora pokročilých scénářů

Metoda AddMicrosoftIdentityWebAppAuthentication v rozhraní Microsoft identity platform API umožňuje vývojářům přidávat kód pro pokročilé scénáře ověřování nebo se přihlásit k odběru událostí OpenIdConnect. Můžete se například přihlásit k odběru onRedirectToIdentityProvider, který vám umožní přizpůsobit žádost o ověření, kterou aplikace odesílá Azure AD B2C.

Pokud chcete podporovat pokročilé scénáře, otevřete soubor Startup.cs a ve ConfigureServices funkci nahraďte AddMicrosoftIdentityWebAppAuthentication následujícím fragmentem kódu:

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

Předchozí kód přidá OnRedirectToIdentityProvider událost s odkazem na metodu OnRedirectToIdentityProviderFunc . Do třídy přidejte následující fragment kódu Startup.cs .

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

Parametry mezi kontrolerem OnRedirectToIdentityProvider a funkcí můžete předávat pomocí parametrů kontextu.

Předem vyplníte přihlašovací jméno.

Během cesty uživatele přihlášení může vaše aplikace cílit na konkrétního uživatele. Když aplikace cílí na uživatele, může v žádosti o login_hint autorizaci zadat parametr dotazu s přihlašovacím jménem uživatele. Azure AD B2C automaticky vyplní přihlašovací jméno a uživatel musí zadat jenom heslo.

Pokud chcete předem naplnit přihlašovací jméno, postupujte takto:

  1. Pokud používáte vlastní zásadu, přidejte požadovanou vstupní deklaraci identity, jak je popsáno v tématu Nastavení přímého přihlášení.

  2. Dokončete postup podpory pokročilých scénářů .

  3. Do funkce přidejte následující řádek kódu OnRedirectToIdentityProvider :

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

Předběžný výběr zprostředkovatele identity

Pokud jste nakonfigurovali přihlašovací cestu pro vaši aplikaci tak, aby zahrnovala účty sociálních sítí, jako je Facebook, LinkedIn nebo Google, můžete zadat domain_hint parametr . Tento parametr dotazu poskytuje nápovědu pro Azure AD B2C o zprostředkovateli sociální identity, který by se měl použít pro přihlášení. Pokud například aplikace zadá domain_hint=facebook.com, tok přihlášení přejde přímo na přihlašovací stránku Facebooku.

Pokud chcete uživatele přesměrovat na externího zprostředkovatele identity, postupujte takto:

  1. Zkontrolujte název domény externího zprostředkovatele identity. Další informace najdete v tématu Přesměrování přihlášení k poskytovateli sociálních sítí.

  2. Dokončete postup podpory pokročilých scénářů .

  3. OnRedirectToIdentityProviderFunc Do funkce přidejte následující řádek kóduOnRedirectToIdentityProvider:

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

Určení jazyka uživatelského rozhraní

Přizpůsobení jazyka v Azure AD B2C umožňuje toku uživatelů přizpůsobit různé jazyky tak, aby vyhovovaly potřebám vašich zákazníků. Další informace najdete v tématu Přizpůsobení jazyka.

Upřednostňovaný jazyk nastavíte takto:

  1. Nakonfigurujte vlastní nastavení jazyka.

  2. Dokončete postup podpory pokročilých scénářů .

  3. Do funkce přidejte následující řádek kódu OnRedirectToIdentityProvider :

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

Předání vlastního parametru řetězce dotazu

S vlastními zásadami můžete předat vlastní parametr řetězce dotazu. Dobrým příkladem použití je, když chcete dynamicky měnit obsah stránky.

Pokud chcete předat vlastní parametr řetězce dotazu, postupujte takto:

  1. Nakonfigurujte element ContentDefinitionParameters .

  2. Dokončete postup podpory pokročilých scénářů .

  3. Do funkce přidejte následující řádek kódu OnRedirectToIdentityProvider :

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

Nápověda k předání tokenu ID

Aplikace předávající strany může v rámci žádosti o autorizaci OAuth2 odeslat příchozí webový token JSON (JWT). Příchozí token představuje nápovědu k uživateli nebo žádosti o autorizaci. Azure AD B2C token ověří a pak deklaraci identity extrahuje.

Pokud chcete do žádosti o ověření zahrnout nápovědu tokenu ID, postupujte takto:

  1. Dokončete postup podpory pokročilých scénářů .

  2. Ve vlastních zásadách definujte technický profil nápovědy tokenu ID.

  3. Do funkce přidejte následující řádek kódu OnRedirectToIdentityProvider :

    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 účtu

Pokud chcete přizpůsobit akce SignIn, SignUp nebo SignOut , doporučujeme vám vytvořit si vlastní kontroler. Vlastní kontroler umožňuje předávat parametry mezi kontrolerem a knihovnou ověřování. AccountController je součástí Microsoft.Identity.Web.UI balíčku NuGet, který zpracovává akce přihlášení a odhlášení. Jeho implementaci najdete ve webové knihovně Microsoft Identity.

Přidání kontroleru účtu

V projektu sady Visual Studio klikněte pravým tlačítkem na složku Controllers a přidejte nový kontroler. Vyberte MVC – Prázdný kontroler a zadejte název MyAccountController.cs.

Následující fragment kódu ukazuje vlastní MyAccountController s akcí SignIn (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);
        }

    }
}

V zobrazení _LoginPartial.cshtml změňte přihlašovací odkaz na ovladač.

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

Předání ID zásad Azure AD B2C

Následující fragment kódu ukazuje vlastní s akcí SignIn and SignUp .Následující fragment kódu ukazuje vlastní MyAccountController akci SignIn and SignUp ( Přihlásit se). Akce předá do ověřovací knihovny parametr s názvem policy . To vám umožní zadat správné ID zásad B2C Azure AD pro konkrétní akci.

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

V zobrazení _LoginPartial.cshtml změňte asp-controller hodnotu MyAccountController na u všech dalších ověřovacích odkazů, jako je registrace nebo úprava profilu.

Předání vlastních parametrů

Následující fragment kódu ukazuje vlastní MyAccountController s akcí SignIn (SignIn ). Akce předá do ověřovací knihovny parametr s názvem campaign_id .

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

Dokončete postup Podpora pokročilých scénářů a pak v OnRedirectToIdentityProvider metodě přečtěte vlastní parametr:

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

Zabezpečení přesměrování odhlášení

Po odhlášení se uživatel přesměruje na identifikátor URI zadaný v parametru post_logout_redirect_uri bez ohledu na adresy URL odpovědí zadané pro aplikaci. Pokud je však předána platná id_token_hint hodnota a je zapnuta možnost Vyžadovat token ID v požadavcích na odhlášení, Azure AD B2C před provedením přesměrování ověří, že hodnota post_logout_redirect_uri odpovídá jednomu z nakonfigurovaných identifikátorů URI pro přesměrování aplikace. Pokud pro aplikaci nebyla nakonfigurována žádná odpovídající adresa URL odpovědi, zobrazí se chybová zpráva a uživatel nebude přesměrován.

Pokud chcete ve své aplikaci podporovat zabezpečené přesměrování odhlášení, nejprve postupujte podle kroků v částech Kontroler účtů a Pokročilé scénáře podpory . Pak postupujte podle následujících kroků:

  1. V MyAccountController.cs kontroleru přidejte akci SignOut pomocí následujícího fragmentu kódu:

    [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. Ve třídě Startup.cs parsujte id_token_hint hodnotu a připojte hodnotu k požadavku na ověření. Následující fragment kódu ukazuje, jak předat id_token_hint hodnotu požadavku na ověření:

    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 Do funkce přidejte SaveTokens možnost Kontrolery mají přístup k hodnotěid_token:

    services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(options =>
        {
            Configuration.Bind("AzureAdB2C", options);
            options.Events ??= new OpenIdConnectEvents();        
            options.Events.OnRedirectToIdentityProviderForSignOut += OnRedirectToIdentityProviderForSignOutFunc;
            options.SaveTokens = true;
        });
    
  4. Do konfiguračního souboru appsettings.json přidejte cestu identifikátoru URI pro přesměrování odhlášení ke SignedOutCallbackPath klíči.

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

Ve výše uvedeném příkladu budou post_logout_redirect_uri předávané do žádosti o odhlášení ve formátu : https://your-app.com/signout/<your-sign-up-in-policy>. Tato adresa URL musí být přidána do adresy URL odpovědi pro registraci aplikace.

Řízení přístupu na základě role

Pomocí autorizace v ASP.NET Core můžete zkontrolovat, jestli mají uživatelé oprávnění k přístupu k chráněnému prostředku, a to pomocí jedné z následujících metod:

ConfigureServices V metodě přidejte metoduAddAuthorization, která přidá autorizační model. Následující příklad vytvoří zásadu s názvem EmployeeOnly. Zásada zkontroluje, jestli existuje deklarace identity EmployeeNumber . Hodnota deklarace identity musí být jedno z následujících ID: 1, 2, 3, 4 nebo 5.

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

Autorizaci v ASP.NET Core řídíte pomocí authorizeAttribute a jeho různých parametrů. V nejzákladnější podobě omezuje použití atributu Authorize na kontroler, akci nebo stránku Razor Page přístup k ověřeným uživatelům této komponenty.

Zásady pro kontrolery použijete pomocí atributu Authorize s názvem zásady. Následující kód omezuje přístup k Claims akci na uživatele, kteří jsou autorizováni zásadou EmployeeOnly :

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

Další kroky