Существует несколько способов решения проблемы, с которой вы столкнулись, но сначала давайте разберемся, почему она в настоящее время не работает.
Что DefaultAuthenticateScheme
означает
Когда вы устанавливаете значение в DefaultAuthenticateScheme
свойство AuthenticationOptions
, вы указываете промежуточному программному обеспечению аутентификации пытаться аутентифицировать каждый HTTP-запрос по этой конкретной схеме.Я предполагаю, что вы используете ASP.NET Identity для проверки подлинности на основе файлов cookie, и при вызове AddIdentity
она регистрирует схему проверки подлинности с использованием файлов cookie по умолчанию для целей проверки подлинности;Вы можете увидеть это в исходном коде на GitHub .
Однако это не означает, что вы не можете использовать любую другую схему аутентификации в своем приложении.
политика по умолчанию для системы авторизации
Если все защищенные конечные точки вашего приложения должны быть доступны для клиентов, прошедших проверку подлинности с помощью файлов cookie или JWT, одним из вариантов является использование политики по умолчанию для системы авторизации.Эта специальная политика используется, когда вы используете «пустые» экземпляры класса AuthorizeAttribute
- либо в качестве атрибута для украшения контроллеров / действий, либо глобально на уровне приложения с помощью new AuthorizeFilter(new AuthorizeAttribute())
.
Политики по умолчанию.устанавливается только для аутентифицированного пользователя, но не определяет, какие схемы аутентификации нужно «попробовать» для аутентификации запроса.В результате он полагается на процесс аутентификации, который уже был выполнен.Это объясняет поведение, которое вы испытываете, когда одновременно работает только одна из 2 схем.
Мы можем изменить политику по умолчанию с помощью небольшого кода:
services.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("<your-cookie-authentication-scheme", "your-jwt-authentication-scheme")
.Build();
})
Специальные политики авторизации
Если вы оказались в ситуации, когда вам требуется, чтобы некоторые конечные точки были доступны только для клиентов, прошедших проверку подлинности с помощью файлов cookie, и других с JWT, вы можете воспользоваться политиками авторизации.
Они работают точно так же, какполитика по умолчанию, ожидайте, что вы можете выбрать для конечной точки, какой из них применяется.Вы можете добавить политики следующим образом:
services.AddAuthorization(options =>
{
options.AddPolicy("Cookies", new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("<your-cookie-authentication-scheme")
.Build());
options.AddPolicy("JWT", new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("<your-jwt-authentication-scheme")
.Build());
})
Затем вы можете ссылаться на эти политики в соответствующих конечных точках, отмечая их [Authorize(Policy = "<policy-name>")]
.В качестве примечания: если единственным отличием между вашими политиками является схема аутентификации, можно достичь того же результата без создания политик и обращения к соответствующей схеме (ам) аутентификации в атрибутах [Authorize]
со свойством AuthenticationSchemes
.
Политики полезны, когда у вас есть более сложные правила, например, , для которых конкретное утверждение требует, например, это конкретное значение .
Надеюсь, это поможет, дайте мне знать, как выидти!?