Включение параметров проверки подлинности в веб-приложении с помощью Azure AD B2C
В этой статье описывается, как включить, настроить и улучшить аутентификацию Azure Active Directory B2C (Azure AD B2C) для вашего веб-приложения.
Прежде чем начать, важно ознакомиться со следующими статьями.
- Настройка проверки подлинности в образце веб-приложения
- Включение проверки подлинности в собственном веб-приложении.
Использование личного домена
С помощью личного домена можно полностью брендировать URL-адрес проверки подлинности. С точки зрения пользователя, пользователи остаются в вашем домене во время процесса аутентификации, а не перенаправляются на доменное имя b2clogin.com в Azure AD B2C.
Чтобы удалить все ссылки на b2c в URL-адресе, вы также можете заменить свое имя клиента B2C, contoso.onmicrosoft.com, в URL-адресе запроса проверки подлинности на свой GUID идентификатора клиента. Например, можно изменить https://fabrikamb2c.b2clogin.com/contoso.onmicrosoft.com/
на https://account.contosobank.co.uk/<tenant ID GUID>/
.
Чтобы использовать личный домен и ваш идентификатор клиента в URL-адресе проверки подлинности, выполните инструкции, изложенные в статье Подключение личных доменов в Azure Active Directory B2C. В корневой папке проекта откройте файл appsettings.json. Он содержит сведения о поставщике удостоверений Azure AD B2C.
В файле appsettings.json сделайте следующее.
- Обновите запись
Instance
, используя личный домен. - Обновите запись
Domain
, указав ваш идентификатор клиента. Дополнительные сведения см. в разделе Использование идентификатора клиента.
В следующем коде 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 автоматически заполняет имя для входа в систему — пользователю нужно ввести только пароль.
Чтобы предварительно заполнить имя для входа, выполните следующие действия.
Если вы используете настраиваемую политику, добавьте обязательное входящее утверждение, как описано в статье Настройка прямого входа в систему.
Выполните процедуру из раздела Поддержка сложных сценариев.
Добавьте в функцию
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.
Чтобы перенаправить пользователей к внешнему поставщику удостоверений, выполните следующие действия.
Проверьте доменное имя внешнего поставщика удостоверений. Дополнительные сведения см. в статье Перенаправление входа в поставщика социальных сетей.
Выполните процедуру из раздела Поддержка сложных сценариев.
В функции
OnRedirectToIdentityProviderFunc
добавьте следующую строку кода к функцииOnRedirectToIdentityProvider
:private async Task OnRedirectToIdentityProviderFunc(RedirectContext context) { context.ProtocolMessage.DomainHint = "facebook.com"; // More code await Task.CompletedTask.ConfigureAwait(false); }
Указание языка пользовательского интерфейса
Настройка языка в Azure AD B2C позволяет поддерживать в потоке разные языки в соответствии с требованиями пользователей. Дополнительные сведения см. в статье Настройка языка.
Чтобы задать предпочитаемый язык, выполните следующие действия:
Выполните процедуру из раздела Поддержка сложных сценариев.
Добавьте в функцию
OnRedirectToIdentityProvider
следующую строку кода:private async Task OnRedirectToIdentityProviderFunc(RedirectContext context) { context.ProtocolMessage.UiLocales = "es"; // More code await Task.CompletedTask.ConfigureAwait(false); }
Передача настраиваемого параметра строки запроса
С помощью настраиваемых политик можно передать параметр настраиваемой строки запроса. Хорошим практическим примером является ситуация, когда требуется динамически изменять содержимое страницы.
Чтобы передать настраиваемый параметр строки запроса, выполните следующие действия.
Настройка элемента ContentDefinitionParameters.
Выполните процедуру из раздела Поддержка сложных сценариев.
Добавьте в функцию
OnRedirectToIdentityProvider
следующую строку кода:private async Task OnRedirectToIdentityProviderFunc(RedirectContext context) { context.ProtocolMessage.Parameters.Add("campaignId", "123"); // More code await Task.CompletedTask.ConfigureAwait(false); }
Передача указания к маркеру идентификатора
Приложения проверяющей стороны могут передавать входящие маркеры JSON Web Token (JWT) в рамках запроса авторизации OAuth2. Входящий маркер представляет собой указание о пользователе или запросе на авторизацию. Azure AD B2C проверяет маркер и извлекает утверждение.
Чтобы включить указание маркера идентификатора в запрос проверки подлинности, сделайте следующее:
Выполните процедуру из раздела Поддержка сложных сценариев.
В пользовательской политике определите технический профиль указания для маркера идентификатора.
Добавьте в функцию
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); }
Контроллер учетной записи
Если вы хотите настроить действия Вход в систему, Регистрация или Выход из системы, мы рекомендуем вам создать свой собственный контроллер. Наличие собственного контроллера позволяет передавать параметры между контроллером и библиотекой проверки подлинности.
AccountController
является частью пакета Microsoft.Identity.Web.UI
NuGet, который обрабатывает действия входа и выхода. Его реализацию можно найти в библиотеке Microsoft Identity Web.
Добавление контроллера учетных записей
В своем проекте 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 Active Directory 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 Active Directory B2C проверяет, соответствует ли значение post_logout_redirect_uri
одному из настроенных URI перенаправления приложения перед выполнением перенаправления. Если соответствующий URL-адрес ответа не был настроен для приложения, выводится сообщение об ошибке, и пользователь не перенаправляется.
Чтобы можно было использовать в вашем приложении защищенное перенаправление при выходе из системы, сначала выполните действия, описанные в разделах Контроллер учетной записи и Поддержка сложных сценариев. Затем выполните указанные ниже действия.
В контроллере
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); }
В классе 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); }
В функции
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; });
В файле конфигурации 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 контролируется с помощью класса AuthorizeAttribute и его параметров. В самой простой форме применение атрибута Authorize
к контроллеру, действию или странице Razor ограничивает доступ для аутентифицированных пользователей этого компонента.
Политики применяются к контроллерам с помощью атрибута Authorize
, указываемого с именем политики. Следующий код предоставляет доступ к действию Claims
только пользователям, получившим разрешение от политики EmployeeOnly
:
[Authorize(Policy = "EmployeeOnly")]
public IActionResult Claims()
{
return View();
}
Дальнейшие действия
- Дополнительные сведения об авторизации см. в разделе Введение в авторизацию в ASP.NET Core.