Я работаю с .Net Core Web API и .Net Core Web MVC Application. Оба они используют Azure AD B2C для аутентификации пользователей. Но чтобы получить ответ от HttpRequest из веб-API, мне нужно предоставить токен доступа JWT от B2C для вошедшего в систему пользователя в моем веб-приложении MVC. Есть ли способ получить этот токен доступа внутри контроллера, используя аутентифицированного «Пользователя».
Я попытался получить доступ к утверждениям вошедшего в систему пользователя, но мне не повезло. Я также использовал jwt.ms, чтобы проверить, хорошо ли работает рабочий процесс B2C и что токен JWT создается и работает. Приложение MVC аутентифицирует пользователя, а веб-API отлично работает с жестко заданным токеном. Мне просто нужно получить токен доступа от вошедшего в систему пользователя, а не жестко запрограммировать его.
Я ожидаю, что смогу получить токен доступа B2C JWT, чтобы позже передать его в веб-API и защитить свои запросы.
Вам нужна именно эта строка токена? Если это так, вы можете получить доступ к заголовкам, используя HttpContext внутри контроллера? HttpContext будет иметь коллекцию заголовков, которые были переданы в
На самом деле это исходный веб-токен JSON из строки B2C, который мне нужен, но мне нужно получить к нему доступ из контроллера MVC из веб-приложения. Я попробовал ваше предложение, но после просмотра заголовков HttpContext я все еще не вижу строку токена. Может быть, у вас есть какой-нибудь пример кода или фрагмент кода, на который я мог бы взглянуть?
@AndreVigneault, насколько я знаю, должен быть в заголовке с ключом Authorization
и значением Bearer <token here>
. Вы вообще не видите заголовок Auth?
То, что я сказал, «должно» быть правильным. Добавили ли вы IHttpContextAccessor в регистрацию ServicesCollection и внедрили ли его в свой контроллер для доступа к заголовкам? Я найду для вас пример кода
Спасибо за продолжение, Роберт, да, я использую IHttpContextAccessor, но все еще не могу найти токен JWT, пример кода наверняка будет полезен, если он у вас есть.
Вы можете обратиться к это пример приложения.
Он использует ПО промежуточного слоя ASP.NET Core Azure AD B2C для аутентификации конечного пользователя и MSAL.NET для получения, кэширования и обновления маркера доступа.
Токен доступа получен в класс AzureADB2COpenIdConnectOptionsConfigurator.
Пример кода для метода контроллера, ссылающегося на токен доступа, — здесь.
Спасибо за ваш ответ, Крис, но B2C уже предоставляет мне (мой сайт с пакетом nuget выше) начальный JWT. Нет ли где-нибудь доступа к этому начальному токену? Должен ли я вручную получать дополнительные токены?
Привет @AndreVigneault. Я обновил приведенный выше ответ со ссылкой на пакет AzureADB2C.UI.
Получив некоторую помощь от команды MS AzureADB2C.UI GitHub, мы смогли решить проблему. Проблема заключалась в том, что токены не сохраняются по умолчанию в библиотеке, поэтому нам нужно было настроить ODC, чтобы указать, что токены должны быть сохранены для будущего использования в приложении. Итак, вот пример кода конфигурации «Запуск» и пример того, как запросить «токен доступа JWT» у контроллера.
Запуск.cs:
services.Configure(AzureADB2CDefaults.OpenIdScheme, options => {
options.SaveTokens = true;
});
Контроллер:
string idToken = await HttpContext.GetTokenAsync("id_token");
Более подробную информацию о том, как была решена проблема, можно найти по следующей ссылке: https://github.com/aspnet/AspNetCore/issues/11424
Привет @Andre Это также сохраняет токен доступа?
Да, @ChrisPadgett, это так.
Спасибо, Андре, я полагаю, что пакет AzureADB2C.UI не обновляет токен доступа после истечения срока его действия. Я создал пример приложения, которое делает это с помощью MSAL.NET. Я обновил свой другой ответ ссылкой на пример приложения, которое можно найти здесь.
Еще одна информация, которая может помочь, заключается в том, что я использую шаблон B2C для веб-приложения MVC .Net Core, которое использует пакет Nuget AzureADB2C.UI для получения JWT из Azure.