Вы можете полностью достичь того, что вы хотите:
services
.AddAuthentication()
.AddJwtBearer("Firebase", options =>
{
options.Authority = "https://securetoken.google.com/my-firebase-project"
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = "my-firebase-project"
ValidateAudience = true,
ValidAudience = "my-firebase-project"
ValidateLifetime = true
};
})
.AddJwtBearer("Custom", options =>
{
// Configuration for your custom
// JWT tokens here
});
services
.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase", "Custom")
.Build();
});
Давайте рассмотрим различия между вашим кодом и этим.
AddAuthentication не имеет параметров
Если вы установите схему аутентификации по умолчанию, то при каждом отдельном запросе промежуточное ПО аутентификации будет пытаться запустить обработчик аутентификации, связанный со схемой аутентификации по умолчанию. Поскольку теперь у нас есть две схемы аутентификации, запускать одну из них бессмысленно.
Использовать другую перегрузку AddJwtBearer
Каждый метод AddXXX для добавления аутентификации имеет несколько перегрузок:
Тот, где используется схема аутентификации по умолчанию, связанная с методом аутентификации, как вы можете видеть здесь для аутентификации куки
Тот, где вы передаете, в дополнение к настройке опций, имя схемы аутентификации, как при этой перегрузке
Теперь, поскольку вы используете один и тот же метод аутентификации дважды, но схемы аутентификации должны быть уникальными, вам нужно использовать вторую перегрузку.
Обновление политики по умолчанию
Поскольку запросы больше не будут аутентифицироваться автоматически, добавление атрибутов [Authorize] для некоторых действий приведет к отклонению запросов и выдаче HTTP 401.
Поскольку это не то, что мы хотим, потому что мы хотим дать обработчикам аутентификации возможность аутентифицировать запрос, мы изменим политику по умолчанию системы авторизации, указав, что обе аутентификационные схемы Firebase и Custom должны пытаться аутентифицировать запрос.
Это не мешает вам быть более ограничительным в отношении некоторых действий; атрибут [Authorize] имеет свойство AuthenticationSchemes, которое позволяет вам переопределить, какие схемы аутентификации действительны.
Если у вас есть более сложные сценарии, вы можете использовать авторизацию на основе политик. Я считаю, что официальная документация отличная.
Давайте представим, что некоторые действия доступны только для токенов JWT, выпущенных Firebase, и должны иметь заявку с определенным значением; Вы могли бы сделать это так:
services
.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase", "Custom")
.Build();
options.AddPolicy("FirebaseAdministrators", new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase")
.RequireClaim("role", "admin")
.Build());
});
Затем вы можете использовать [Authorize(Policy = "FirebaseAdministrators")]
для некоторых действий.