Как добавить JwtBearer вместе с AddMicrosoftIdentityWebAppAuthentication

Я не уверен, что полностью понял изменения для Microsoft.Identity.Web, но я следил за статьей (предоставленной Microsoft здесь) Где описано, как измениться при запуске

 services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
     .AddAzureAD(options => Configuration.Bind("AzureAd", options));

к

services.AddMicrosoftIdentityWebAppAuthentication(Configuration);

в то время как это выглядит хорошо и просто, у меня есть немного больше работы, потому что у меня есть следующий фрагмент в моем существующем коде

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
   .AddAzureAD(options => this.configuration.Bind("AzureAd", options))
   .AddJwtBearer(options =>
   {
       //this code used to validate signing keys
       string stsDiscoveryEndpoint = "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration";
       IConfigurationManager<OpenIdConnectConfiguration> configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(stsDiscoveryEndpoint, new OpenIdConnectConfigurationRetriever());
       OpenIdConnectConfiguration openIdConfig = configurationManager.GetConfigurationAsync(CancellationToken.None).GetAwaiter().GetResult();
       var tenantId = this.configuration["TenantId"];
       var validIssuer = $"https://sts.windows.net/{tenantId}/";

       options.TokenValidationParameters = new TokenValidationParameters()
       {
           ValidIssuer = validIssuer,
           ValidAudience = this.configuration["ClientId"],
           IssuerSigningKeys = openIdConfig.SigningKeys,
       };
  });

Чтобы дать вам немного контекста, у нас есть два варианта этого приложения.

  1. Войдите в систему и выполните некоторые действия (здесь пользователь получит диалоговое окно входа в Microsoft для входа в систему, используя свои учетные данные)
  2. Microsoft Azure вызывает нашу конечную точку с некоторым токеном, и нам нужно проверить этот токен.

Раздел JWTvaliation, который вы видите выше, предназначен для второго элемента, где после получения токена мы проверяем этот токен без входа в систему и рабочего процесса пользовательского интерфейса.

Вопрос: Приведенный выше код работает правильно. Единственная проблема здесь заключается в том, что если нам нравится использовать Microsoft.Identity, как мы должны использовать второй элемент (JWT), потому что services.AddAuthentication().AddAzureAD возвращает IAuthenticationBuilder, который мы используем дальше, чтобы добавить AddJwtBearer, тогда как services.AddMicrosoftIdentityWebAppAuthentication не возвращает IAuthenticationBuilder.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
4 033
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

AddMicrosoftIdentityWebAppAuthentication на самом деле просто причудливый способ сделать следующее:

services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(…)

Таким образом, он настраивает схему по умолчанию как схему OIDC и запускает AddMicrosoftIdentityWebApp для настройки того, что это в конечном итоге делает.

Теперь AddAuthentication можно вызывать несколько раз в коллекции сервисов. Вам просто нужно быть осторожным, чтобы не перенастроить вещи неправильно. Функция без параметров этого не делает, поэтому это хороший способ получить доступ к IAuthenticationBuilder для дальнейшей настройки аутентификации.

Это означает, что вы можете изменить свой код следующим образом:

// configure Microsoft Identity Web first
// this also sets the default authentication to OIDC
services.AddMicrosoftIdentityWebAppAuthentication(Configuration);

// retrieve an authentication builder without changing the default
services.AddAuthentication()
    // add JWT bearer now
   .AddJwtBearer(options =>
   {
       // …
   });

Мне нравится ваше объяснение, и, вероятно, это тоже правильный ответ. Тем не менее, мне нравится знать очень быструю альтернативу, правильное ли это понимание или это изменит цель. Вместо кода, который вы написали, мы можем иметь что-то вроде services.AddAuthentication (). ваш пример?

Brijesh Shah 22.12.2020 23:06

@BrjeshShah Поскольку AddMicrosoftIdentityWebAppAuthentication нужно вызывать в наборе услуг, вы не можете запустить его сразу после AddJwtBearer. Вам придется снова вызвать его services. Но да, вы можете поменять местами эти два утверждения в моем примере, ничего не поменяв. Порядок имеет значение только для конфигураций (более поздние конфигурации могут перезаписывать более ранние конфигурации).

poke 23.12.2020 11:56

Другие вопросы по теме