Можем ли мы использовать аутентификацию как по протоколу OAuth, так и по сертификату в ASP .NET Core 5?

#asp.net-core #asp.net-core-webapi #asp.net-authentication

#asp.сетевое ядро #asp.net-ядро-webapi #asp.net-аутентификация

Вопрос:

В настоящее время у нас есть рабочая аутентификация OAuth для нашей ASP.NET Веб-API ядра 5. Мы также хотели бы добавить проверку подлинности сертификата, чтобы быть вдвойне уверенными в нашем абоненте. Есть ли способ заполучить их обоих? Я попробовал приведенный ниже код, но он переопределяет одно над другим.

 services.AddAuthentication(AzureADDefaults.JwtBearerAuthenticationScheme) .AddAzureADBearer(options =gt; {  options.Instance = aADInstance;  options.ClientId = clientIdWithScope;  options.Domain = aADDomain;  options.TenantId = aADTenantId; } ) services.AddAuthentication( CertificateAuthenticationDefaults.AuthenticationScheme)  .AddCertificate();   

Ответ №1:

Изменение политики по умолчанию

 // Add authentication schemes before, we already did this, so I would skip this part  // Change default Authorization policy services.AddAuthorization(cfg =gt;  cfg.DefaultPolicy =  new AuthorizationPolicyBuilder(CertificateAuthenticationDefaults.AuthenticationScheme,  AzureADDefaults.JwtBearerAuthenticationScheme).RequireAuthenticatedUser().Build());  

[Authorize] атрибут теперь потребует , чтобы все http-запросы удовлетворялись обоим CertificateAuthenticationDefaults.AuthenticationScheme , и AzureADDefaults.JwtBearerAuthenticationScheme это может быть не то поведение, которое мы хотим для всех наших конечных точек, поэтому будьте осторожны с этим подходом.

Добавьте нашу собственную политику

 // Add authentication schemes before, we already did this, so I would skip this part  // Adding our own policy services.AddAuthorization(options =gt; {  options.AddPolicy("ComposedPolicy", p =gt;  {  p.AuthenticationSchemes = new Listlt;stringgt;  {CertificateAuthenticationDefaults.AuthenticationScheme, AzureADDefaults.JwtBearerAuthenticationScheme};  p.RequireAuthenticatedUser();  p.Build();  }); });  

[Authorize] поведение атрибутов теперь будет нетронутым, но всякий раз, когда мы хотим использовать нашу пользовательскую политику, мы должны указывать их [Authorize(Policy = "ComposedPolicy")] .

Просто выберите подход, который подходит лучше всего.