Включение проверки подлинности в собственном веб-API с помощью Azure AD B2C
Чтобы авторизовать доступ к веб-API, можно обслуживать только запросы, содержащие допустимый маркер доступа, который возникает с проблемами Azure Active Directory B2C (Azure AD B2C). В этой статье показано, как включить авторизацию Azure AD B2C для веб-API. После выполнения действий, описанных в этой статье, вызывать конечные точки веб-API будет разрешено только пользователям, получившим действительный маркер доступа.
Необходимые компоненты
Прежде чем начать, прочитайте одну из следующих статей, в которых обсуждается настройка проверки подлинности для приложений, вызывающих веб-API. Затем выполните действия, описанные в этой статье, заменив взятый для примера веб-API на собственный веб-API.
- Настройка проверки подлинности в примере приложения ASP.NET Core
- Настройка проверки подлинности в примере одностраничного приложения
Обзор
Проверка подлинности на основе маркеров гарантирует, что запросы к веб-API включают допустимый маркер доступа.
Приложение выполняет следующие действия.
Выполняет проверку подлинности пользователей с помощью Azure AD B2C.
Получает маркер доступа с необходимыми разрешениями (областями) для конечной точки веб-API.
Передает маркер доступа как маркер носителя в заголовке авторизации HTTP-запроса, используя следующий формат:
Authorization: Bearer <access token>
Веб-API выполняет следующие действия.
Считывает маркер носителя из заголовка авторизации в HTTP-запросе.
Проверяет маркер.
Проверяет разрешения (области) в маркере.
Считывает утверждения, которые кодируются в маркере (необязательно).
Отвечает на HTTP-запрос.
Обзор регистрации приложений
Чтобы включить вход приложения в Azure AD B2C и вызвать веб-API, необходимо зарегистрировать два приложения в каталоге Azure AD B2C.
Регистрация мобильного, одностороннего или веб- приложения позволяет приложению выполнять вход с помощью Azure AD B2C. В процессе регистрации приложения создается идентификатор приложения, который также называется идентификатором клиента. Он однозначно идентифицирует ваше приложение (например, идентификатор приложения: 1).
После регистрации веб-API приложение сможет совершать вызовы к защищенному веб-API. После регистрации станут доступны разрешения (области) веб-API. В процессе регистрации приложения система создает идентификатор приложения, с помощью которого можно уникальным образом идентифицировать ваш веб-API (например, идентификатор приложения: 2). Предоставьте своему приложению (с идентификатором приложения App ID 1) разрешения для областей веб-API (с идентификатором приложения App ID 2).
Регистрации приложений и архитектура приложений описаны на следующей схеме:
Подготовка среды разработки
В следующих разделах вы создадите проект веб-API. Выберите язык программирования: ASP.NET Core или Node.js. Убедитесь, что у вас есть компьютер, работающий под управлением любого из следующих программ:
- Visual Studio Code
- C# для Visual Studio Code (последняя версия)
- Пакет SDK для .NET 5.0
Шаг 1. Создание защищенного веб-API
Создайте новый проект веб-API. Сначала выберите язык программирования, которые вы хотите использовать: ASP.NET Core или Node.js.
Используйте команду dotnet new
. Команда dotnet new
создает новую папку с именем TodoList с ресурсами проекта веб-API. Откройте каталог, а затем откройте Visual Studio Code.
dotnet new webapi -o TodoList
cd TodoList
code .
При появлении запроса "Добавьте необходимые ресурсы в проект" выберите Да.
Шаг 2. Установка зависимостей
Добавьте библиотеку проверки подлинности в проект веб-API. Библиотека проверки подлинности анализирует заголовок проверки подлинности HTTP, проверяет маркер и извлекает утверждения. Дополнительные сведения см. в документации по библиотеке.
Чтобы добавить библиотеку проверки подлинности, установите пакет, выполнив следующую команду:
dotnet add package Microsoft.Identity.Web
Шаг 3. Запуск библиотек проверки подлинности
Добавьте необходимый код для запуска библиотеки проверки подлинности.
Откройте Startup.cs и добавьте следующие объявления using
в начало класса.
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;
Найдите функцию ConfigureServices(IServiceCollection services)
. Затем перед строкой кода services.AddControllers();
добавьте следующий фрагмент кода:
public void ConfigureServices(IServiceCollection services)
{
// Adds Microsoft Identity platform (Azure AD B2C) support to protect this Api
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(options =>
{
Configuration.Bind("AzureAdB2C", options);
options.TokenValidationParameters.NameClaimType = "name";
},
options => { Configuration.Bind("AzureAdB2C", options); });
// End of the Microsoft Identity platform block
services.AddControllers();
}
Найдите функцию Configure
. Затем сразу после строки кода app.UseRouting();
добавьте следующий фрагмент кода:
app.UseAuthentication();
После изменения код должен выглядеть, как показано в следующем фрагменте кода:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
// Add the following line
app.UseAuthentication();
// End of the block you add
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
Шаг 4. Добавление конечных точек
Добавьте две конечные точки в веб-API:
- Анонимная конечная точка
/public
. Эта конечная точка возвращает текущие дату и время. Используйте ее для отладки веб-API с анонимными вызовами. - Защищенная конечная точка
/hello
. Эта конечная точка возвращает значение утвержденияname
в маркере доступа.
Чтобы добавить анонимную конечную точку, сделайте следующее:
В папке /Controllers добавьте файл PublicController.cs и добавьте его в следующий фрагмент кода:
using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace TodoList.Controllers
{
[ApiController]
[Route("[controller]")]
public class PublicController : ControllerBase
{
private readonly ILogger<PublicController> _logger;
public PublicController(ILogger<PublicController> logger)
{
_logger = logger;
}
[HttpGet]
public ActionResult Get()
{
return Ok( new {date = DateTime.UtcNow.ToString()});
}
}
}
Чтобы добавить защищенную конечную точку, сделайте следующее:
В папке /Controllers добавьте файл HelloController.cs и добавьте его в следующий код:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.Identity.Web.Resource;
namespace TodoList.Controllers
{
[Authorize]
[RequiredScope("tasks.read")]
[ApiController]
[Route("[controller]")]
public class HelloController : ControllerBase
{
private readonly ILogger<HelloController> _logger;
private readonly IHttpContextAccessor _contextAccessor;
public HelloController(ILogger<HelloController> logger, IHttpContextAccessor contextAccessor)
{
_logger = logger;
_contextAccessor = contextAccessor;
}
[HttpGet]
public ActionResult Get()
{
return Ok( new { name = User.Identity.Name});
}
}
}
Контроллер HelloController
помечен атрибутом AuthorizeAttribute, который ограничивает доступ, предоставляя его только пользователям, прошедшим проверку подлинности.
Контроллер также помечен [RequiredScope("tasks.read")]
. RequiredScopeAttribute проверяет, вызывается ли веб-API из правильных областей, tasks.read
.
Шаг 5. Настройка веб-сервера
В среде разработки настройте веб-API для ожидания передачи данных через порт входящих HTTP- или HTTPS-запросов. В этом примере используйте порт HTTP 6000 и порт HTTPS 6001. Базовым универсальным кодом ресурса (URI) веб-API будет http://localhost:6000
для HTTP и https://localhost:6001
— для HTTPS.
Добавьте следующий фрагмент JSON в файл appsettings.json.
"Kestrel": {
"EndPoints": {
"Http": {
"Url": "http://localhost:6000"
},
"Https": {
"Url": "https://localhost:6001"
}
}
}
Шаг 6. Настройка веб-API
Добавьте конфигурации в файл конфигурации. Он содержит сведения о вашем поставщике удостоверений Azure AD B2C. Приложение веб-API использует эти сведения для проверки маркера доступа, который передает веб-приложение в качестве маркера носителя.
В корневом каталоге проекта откройте файл appsettings.json, а затем добавьте следующие параметры:
{
"AzureAdB2C": {
"Instance": "https://contoso.b2clogin.com",
"Domain": "contoso.onmicrosoft.com",
"ClientId": "<web-api-app-application-id>",
"SignedOutCallbackPath": "/signout/<your-sign-up-in-policy>",
"SignUpSignInPolicyId": "<your-sign-up-in-policy>"
},
// More settings here
}
В файле appsettings.json измените следующие свойства:
Раздел | Ключ | Значение |
---|---|---|
AzureAdB2C | Экземпляр | Первая часть имени клиента Azure AD B2C (например, https://contoso.b2clogin.com ). |
AzureAdB2C | Домен | Полное имя клиента Azure AD B2C (например, contoso.onmicrosoft.com ). |
AzureAdB2C | ClientId | Идентификатор приложения веб-API На предыдущей схеме это приложение с идентификатором 2. Сведения о том, как получить идентификатор регистрации приложения веб-API, см. в разделе Предварительные требования. |
AzureAdB2C | SignUpSignInPolicyId | Потоки пользователей или настраиваемая политика. Сведения о том, как получить поток пользователей или политику, см. в разделе Предварительные требования. |
Шаг 7. Запуск и тестирование веб-API
Наконец, запустите веб-API с параметрами среды Azure AD B2C.
В командной оболочке запустите веб-приложение, выполнив следующую команду:
dotnet run
Вы должны увидеть следующие выходные данные. Это будет означает, что приложение работает и готово к получению запросов.
Now listening on: http://localhost:6000
Чтобы остановить выполнение программы, в командной оболочке нажмите клавиши CTRL + C. Повторно запустить приложение можно с помощью команды node app.js
.
Совет
Кроме того, для выполнения команды dotnet run
можно использовать отладчик Visual Studio Code. Встроенный отладчик Visual Studio Code помогает ускорить цикл редактирования, компиляции и отладки.
Откройте веб-браузер и перейдите по адресу http://localhost:6000/public
. В окне браузера должен отобразиться следующий текст, а также текущие дата и время.
Шаг 8. Вызов веб-API из приложения
Попробуйте вызвать защищенную конечную точку веб-API без маркера доступа. Откройте веб-браузер и перейдите по адресу http://localhost:6000/hello
. API вернет сообщение об ошибке из-за неавторизованного HTTP. Это будет подтверждением того, что веб-API защищен с помощью маркера носителя.
Продолжайте настройку приложения для вызова веб-API. Указания см. в разделе Предварительные требования.
Просмотрите это видео, чтобы узнать о рекомендациях по интеграции Azure AD B2C с API.
Следующие шаги
Полный пример доступен на GitHub:
- Получите веб-API, используя библиотеку идентификаторов Microsoft.