Я не уверен, что полностью понял изменения для 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,
};
});
Чтобы дать вам немного контекста, у нас есть два варианта этого приложения.
Раздел JWTvaliation, который вы видите выше, предназначен для второго элемента, где после получения токена мы проверяем этот токен без входа в систему и рабочего процесса пользовательского интерфейса.
Вопрос:
Приведенный выше код работает правильно. Единственная проблема здесь заключается в том, что если нам нравится использовать Microsoft.Identity
, как мы должны использовать второй элемент (JWT), потому что services.AddAuthentication().AddAzureAD
возвращает IAuthenticationBuilder
, который мы используем дальше, чтобы добавить AddJwtBearer
, тогда как services.AddMicrosoftIdentityWebAppAuthentication
не возвращает IAuthenticationBuilder
.
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 =>
{
// …
});
@BrjeshShah Поскольку AddMicrosoftIdentityWebAppAuthentication
нужно вызывать в наборе услуг, вы не можете запустить его сразу после AddJwtBearer
. Вам придется снова вызвать его services
. Но да, вы можете поменять местами эти два утверждения в моем примере, ничего не поменяв. Порядок имеет значение только для конфигураций (более поздние конфигурации могут перезаписывать более ранние конфигурации).
Мне нравится ваше объяснение, и, вероятно, это тоже правильный ответ. Тем не менее, мне нравится знать очень быструю альтернативу, правильное ли это понимание или это изменит цель. Вместо кода, который вы написали, мы можем иметь что-то вроде services.AddAuthentication (). ваш пример?