Поделиться через


Включение параметров проверки подлинности в веб-приложении с помощью Azure AD B2C

Это важно

Начиная с 1 мая 2025 г. Azure AD B2C больше не будет доступен для приобретения для новых клиентов. Дополнительные сведения см. в разделе "Вопросы и ответы".

В этой статье описывается, как включить, настроить и улучшить возможности проверки подлинности Azure Active Directory B2C (Azure AD B2C) для веб-приложения.

Прежде чем начать, важно ознакомиться со следующими статьями:

Использование личного домена

Используя пользовательский домен, вы можете полностью оформить URL-адрес проверки подлинности в соответствии с вашим брендом. С точки зрения пользователя пользователи остаются в домене во время процесса проверки подлинности, а не перенаправляются в домен azure AD B2C b2clogin.com.

Чтобы удалить все ссылки на "b2c" в URL-адресе, вы также можете заменить имя клиента B2C, contoso.onmicrosoft.com, в URL-адресе запроса проверки подлинности идентификатором GUID вашего контрагента. Например, можно изменить https://fabrikamb2c.b2clogin.com/contoso.onmicrosoft.com/ на https://account.contosobank.co.uk/<tenant ID GUID>/.

Чтобы использовать личный домен и идентификатор клиента в URL-адресе проверки подлинности, следуйте инструкциям в разделе "Включить пользовательские домены". В корневой папке проекта откройте файл appsettings.json. Этот файл содержит сведения о поставщике удостоверений Azure AD B2C.

В файлеappsettings.json выполните следующие действия:

В следующем формате JSON показаны параметры приложения перед изменением:

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

В следующем формате JSON показаны параметры приложения после изменения:

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

Поддержка расширенных сценариев

Метод AddMicrosoftIdentityWebAppAuthentication в API платформы удостоверений Майкрософт позволяет разработчикам добавлять код для расширенных сценариев проверки подлинности или подписываться на события OpenIdConnect. Например, вы можете подписаться на OnRedirectToIdentityProvider, что позволяет настроить запрос проверки подлинности, который приложение отправляет в Azure AD B2C.

Чтобы обеспечить поддержку расширенных сценариев, откройте файл Startup.cs и ConfigureServices замените AddMicrosoftIdentityWebAppAuthentication следующий фрагмент кода:

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

Приведенный выше код добавляет событие OnRedirectToIdentityProvider со ссылкой на OnRedirectToIdentityProviderFunc метод. Добавьте следующий фрагмент кода в Startup.cs класс.

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

Параметры можно передавать между контроллером и OnRedirectToIdentityProvider функцией с помощью параметров контекста.

Предварительное заполнение имени входа

Во время процесса входа пользователя ваше приложение может быть ориентировано на определенного пользователя. Когда приложение предназначено для пользователя, оно может указать в запросе авторизации параметр запроса login_hint с именем входа пользователя. Azure AD B2C автоматически заполняет имя входа, а пользователь должен указать только пароль.

Чтобы предварительно заполнить имя входа, сделайте следующее:

  1. Если вы используете настраиваемую политику, добавьте необходимое входное утверждение, как описано в разделе "Настройка прямого входа".

  2. Выполните процедуру расширенных сценариев поддержки .

  3. Добавьте в функцию OnRedirectToIdentityProvider следующую строку кода:

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

Предварительно выберите поставщика удостоверений

Если вы настроили процесс входа приложения, чтобы включить социальные учетные записи, такие как Facebook, LinkedIn или Google, вы можете указать domain_hint параметр. Этот параметр запроса содержит указание Azure AD B2C о социальном поставщике удостоверений, который следует использовать для входа в систему. Например, если приложение указывает domain_hint=facebook.com, поток входа переходит непосредственно на страницу входа в Facebook.

Чтобы перенаправить пользователей к внешнему поставщику удостоверений, сделайте следующее:

  1. Проверьте доменное имя внешнего поставщика удостоверений. Для получения дополнительных сведений см. Перенаправление входа к социальному провайдеру.

  2. Выполните процедуру расширенных сценариев поддержки .

  3. OnRedirectToIdentityProviderFunc В функции добавьте в функцию следующую строку кодаOnRedirectToIdentityProvider:

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

Указание языка пользовательского интерфейса

Настройка языка в Azure AD B2C позволяет потоку пользователей соответствовать различным языкам в соответствии с потребностями клиентов. Дополнительные сведения см. в разделе "Настройка языка".

Чтобы задать предпочтительный язык, сделайте следующее:

  1. Настройте настройку языка.

  2. Выполните процедуру расширенных сценариев поддержки .

  3. Добавьте в функцию OnRedirectToIdentityProvider следующую строку кода:

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

Передача настраиваемого параметра строки запроса

С помощью настраиваемых политик можно передать настраиваемый параметр строки запроса. Хорошим примером использования является динамическое изменение содержимого страницы.

Чтобы передать настраиваемый параметр строки запроса, сделайте следующее:

  1. Настройте элемент ContentDefinitionParameters .

  2. Выполните процедуру расширенных сценариев поддержки .

  3. Добавьте в функцию OnRedirectToIdentityProvider следующую строку кода:

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

Передайте подсказку по токену идентификатора

Приложение проверяющей стороны может отправить входящий веб-токен JSON (JWT) в рамках запроса авторизации OAuth2. Входящий маркер — это указание о пользователе или запросе авторизации. Azure AD B2C проверяет токен, а затем извлекает утверждение.

Чтобы включить идентификационный токен в запрос аутентификации, сделайте следующее:

  1. Выполните процедуру расширенных сценариев поддержки .

  2. В пользовательской политике определите технический профиль указания маркера идентификатора.

  3. Добавьте в функцию 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);
    }
    

Контроллер учетной записи

Если вы хотите настроить действия SignIn, SignUp или SignOut , мы рекомендуем создать собственный контроллер. Наличие собственного контроллера позволяет передавать параметры между контроллером и библиотекой проверки подлинности. AccountController является частью Microsoft.Identity.Web.UI пакета NuGet, который обрабатывает действия входа и выхода. Ее реализацию можно найти в веб-библиотеке удостоверений Майкрософт.

Добавление контроллера учетной записи

В проекте Visual Studio щелкните правой кнопкой мыши папку "Контроллеры " и добавьте новый контроллер. Выберите MVC — пустой контроллер, а затем укажите имя MyAccountController.cs.

В следующем фрагменте кода демонстрируется настраиваемое MyAccountController действие 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);
        }

    }
}

В представлении _LoginPartial.cshtml измените ссылку входа на контроллер.

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

Передача идентификатора политики Azure AD B2C

В следующем фрагменте кода демонстрируется пользовательское MyAccountController действие SignIn и SignUp . Действие передает параметр с именем policy в библиотеку проверки подлинности. Это позволяет указать правильный идентификатор политики Azure AD B2C для конкретного действия.

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

В представлении _LoginPartial.cshtml измените asp-controller значение MyAccountController на любые другие ссылки проверки подлинности, такие как регистрация или изменение профиля.

Передача пользовательских параметров

В следующем фрагменте кода демонстрируется настраиваемое MyAccountController действие SignIn . Действие передает параметр с именем 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);
}

Выполните процедуру расширенных сценариев поддержки , а затем в OnRedirectToIdentityProvider методе прочитайте настраиваемый параметр:

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

Обезопасьте перенаправление после выхода

После выхода пользователь перенаправляется в URI, указанный в параметре post_logout_redirect_uri , независимо от URL-адресов ответа, указанных для приложения. Однако если действительный id_token_hint передается, а маркер запрашиваемого идентификатора в запросах выхода включен, Azure AD B2C проверяет, соответствует ли значение post_logout_redirect_uri одного из настроенных URI перенаправления приложения перед выполнением перенаправления. Если для приложения не настроен соответствующий URL-адрес ответа, отображается сообщение об ошибке и пользователь не перенаправляется.

Чтобы поддерживать защищенное перенаправление выхода в приложении, сначала выполните действия, описанные в разделах "Контроллер учетной записи " и " Поддержка расширенных сценариев ". Затем выполните указанные ниже действия.

  1. В MyAccountController.cs контроллере добавьте действие SignOut с помощью следующего фрагмента кода:

    [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. В классе Startup.cs синтаксический анализ id_token_hint значения и добавление значения в запрос проверки подлинности. В следующем фрагменте кода показано, как передать id_token_hint значение в запрос проверки подлинности:

    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 В функции добавьте SaveTokens параметр для контроллеров с доступом к значениюid_token:

    services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(options =>
        {
            Configuration.Bind("AzureAdB2C", options);
            options.Events ??= new OpenIdConnectEvents();        
            options.Events.OnRedirectToIdentityProviderForSignOut += OnRedirectToIdentityProviderForSignOutFunc;
            options.SaveTokens = true;
        });
    
  4. В файле конфигурации appsettings.json добавьте путь URI перенаправления выхода к ключу SignedOutCallbackPath .

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

В приведенном выше примере post_logout_redirect_uri, переданные в запрос выхода, будут иметь следующий формат: https://your-app.com/signout/<your-sign-up-in-policy> Этот URL-адрес необходимо добавить в URL-адрес ответа регистрации приложений.

Управление доступом на основе ролей

С помощью авторизации в ASP.NET Core можно проверить, разрешены ли пользователи получить доступ к защищенному ресурсу с помощью одного из следующих методов:

В методе ConfigureServices добавьте AddAuthorization метод, который добавляет модель авторизации. В следующем примере создается политика с именем EmployeeOnly. Политика проверяет наличие утверждения EmployeeNumber . Значение утверждения должно быть одним из следующих идентификаторов: 1, 2, 3, 4 или 5.

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

Вы управляете авторизацией в ASP.NET Core с помощью AuthorizationAttribute и его различных параметров. В самой базовой форме применение атрибута Authorize к контроллеру, действию или странице Razor ограничивает доступ к прошедшим проверку подлинности пользователям этого компонента.

Политики применяются к контроллерам с помощью атрибута Authorize с именем политики. Следующий код ограничивает доступ к Claims действию пользователям, которые авторизованы политикой EmployeeOnly :

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

Дальнейшие шаги