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


Включите аутентификацию в вашем веб-API, используя Azure AD B2C.

Это важно

Начиная с 1 мая 2025 г. 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.

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

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

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

Диаграмма регистрации приложений и архитектура приложения для приложения с веб-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 tenant name (например, https://contoso.b2clogin.com).
AzureAdB2C Домен Полное имя клиента Azure AD B2C (например, contoso.onmicrosoft.com).
AzureAdB2C ClientId Идентификатор веб-приложения API. На предыдущей диаграмме это приложение с ID приложения: 2. Чтобы узнать, как получить идентификатор регистрации вашего приложения веб-API, см. Требования.
AzureAdB2C ИдентификаторПолитикиРегистрацииИВхода Пользовательские потоки или пользовательская политика. Чтобы узнать, как получить путь пользователя или политику, см. Prerequisites.

Шаг 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. Для получения информации смотрите раздел Prerequisites.

Посмотрите это видео, чтобы узнать о некоторых лучших практиках, когда вы интегрируете Azure AD B2C с API.

Полный пример можно найти на GitHub.