Как обрабатывать первую аутентификацию с помощью веб-API C#, защищенного .UseMicrosoftIdentityWebApiC#

Место общения программистов C#
Ответить
Anonymous
 Как обрабатывать первую аутентификацию с помощью веб-API C#, защищенного .UseMicrosoftIdentityWebApi

Сообщение Anonymous »

В настоящее время я пишу новый бэкэнд с контроллерами, защищенными атрибутами [Authorize], все очень просто.
И я хочу, чтобы пользователь аутентифицировался на нем в мультиарендной среде.Я создаю этот API для перехода от blazor к более качественному интерфейсному и серверному подходу, поэтому конфигурация была изменена с .UseMicrosoftIdentityWebApp на .AddMicrosoftIdentityWebApi
вся моя конфигурация:

Код: Выделить всё

  services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(bearer =>
{
bearer.Authority = $"{entraIdSettings.Instance}{entraIdSettings.TenantId}/v2.0";
bearer.Audience = entraIdSettings.ClientId;
bearer.TokenValidationParameters = new() { ValidIssuer = bearer.Authority, ValidAudience = bearer.Audience };
}, options =>
{
options.Instance = entraIdSettings.Instance;
options.Domain = entraIdSettings.Domain;
options.TenantId = entraIdSettings.TenantId;
options.ClientId = entraIdSettings.ClientId;
options.ClientSecret = entraIdSettings.ClientSecret;
}).EnableTokenAcquisitionToCallDownstreamApi(options =>
{
options.ClientId = entraIdSettings.ClientId;
options.TenantId = entraIdSettings.TenantId;
options.ClientSecret = entraIdSettings.ClientSecret;
});

services.AddAuthorization(options =>
{
options.AddPolicy("Default", x => x.RequireAuthenticatedUser());
options.DefaultPolicy = options.GetPolicy("Default")!;
});
services.AddDistributedTokenCaches();
services
.Configure(options =>
{
options.DisableL1Cache = false;
options.L1CacheOptions.SizeLimit = 1024 * 1024 * 1024;
options.Encrypt = true;
});
Проблема в том, что я не знаю, как аутентифицировать пользователя таким образом, чтобы его токен носителя автоматически обновлялся по истечении срока действия без обновления пользовательского интерфейса.
Итак... если я правильно понимаю, то, что я должен здесь сделать, это: если пользователь получает ошибку 401, перенаправить его на конечную точку авторизации login.microsoftonline.com.
Я так и делаю. URL-адрес перенаправления указывает на мой контроллер входа в систему, я получаю код авторизации и на этом застреваю.
Что делать с кодом авторизации? Я знаю, что после этого мне придется использовать

Код: Выделить всё

ITokenAcquisition
для получения токенов этот класс уже внедрен и, по-видимому, также используется для обновления токена-носителя пользователя, если срок его действия истек.
Но когда я хочу его использовать, он сообщает мне, что учетная запись не найдена, и выдает мне MsalUIRequiredException.
Он явно ожидает, что я предоставлю ему исходный токен. ему нужен токен обновления. И я знаю, что могу получить это с помощью кода авторизации.
Я пробовал сделать это с помощью ConfidentialClientApplication, это работает, но 1. оно даже не раскрывает токен обновления и 2. если он у меня был, что с ним делать? Сначала я думал, что ConfidentialClientApplication просто запишет токены в тот же кеш, который я настроил в приведенном выше коде. Чтобы, когда я впоследствии вызову ITokenAcquisition, на этот раз это сработало, но не сработало.
Я потратил целый день, чтобы найти ответ или образец , или что-нибудь, что подскажет мне, как будет работать этот первый первоначальный вход, но я не нашел ответа, поэтому, пожалуйста, помогите мне.

Подробнее здесь: https://stackoverflow.com/questions/791 ... otected-by
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»