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

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

Необходимые компоненты

Прежде чем начать, прочитайте одну из следующих статей, в которых обсуждается настройка проверки подлинности для приложений, вызывающих веб-API. Затем выполните действия, описанные в этой статье, заменив взятый для примера веб-API на собственный веб-API.

Обзор

Проверка подлинности на основе маркеров гарантирует, что запросы к веб-API включают допустимый маркер доступа.

Приложение выполняет следующие действия.

  1. Выполняет проверку подлинности пользователей с помощью Azure AD B2C.

  2. Получает маркер доступа с необходимыми разрешениями (областями) для конечной точки веб-API.

  3. Передает маркер доступа как маркер носителя в заголовке авторизации HTTP-запроса, используя следующий формат:

    Authorization: Bearer <access token>
    

Веб-API выполняет следующие действия.

  1. Считывает маркер носителя из заголовка авторизации в HTTP-запросе.

  2. Проверяет маркер.

  3. Проверяет разрешения (области) в маркере.

  4. Считывает утверждения, которые кодируются в маркере (необязательно).

  5. Отвечает на HTTP-запрос.

Обзор регистрации приложений

Чтобы включить вход приложения в Azure AD B2C и вызвать веб-API, необходимо зарегистрировать два приложения в каталоге Azure AD B2C.

  • Регистрация мобильного, одностороннего или веб- приложения позволяет приложению выполнять вход с помощью Azure AD B2C. В процессе регистрации приложения создается идентификатор приложения, который также называется идентификатором клиента. Он однозначно идентифицирует ваше приложение (например, идентификатор приложения: 1).

  • После регистрации веб-API приложение сможет совершать вызовы к защищенному веб-API. После регистрации станут доступны разрешения (области) веб-API. В процессе регистрации приложения система создает идентификатор приложения, с помощью которого можно уникальным образом идентифицировать ваш веб-API (например, идентификатор приложения: 2). Предоставьте своему приложению (с идентификатором приложения App ID 1) разрешения для областей веб-API (с идентификатором приложения App ID 2).

Регистрации приложений и архитектура приложений описаны на следующей схеме:

Diagram of the application registrations and the application architecture for an app with web API.

Подготовка среды разработки

В следующих разделах вы создадите проект веб-API. Выберите язык программирования: ASP.NET Core или Node.js. Убедитесь, что у вас есть компьютер, работающий под управлением любого из следующих программ:

Шаг 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: