Когда вы используете AddIdentity<TUser, TRole>
, этот вызов настраивает схему аутентификации по умолчанию, например: ( source ):
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme;
options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme;
options.DefaultSignInScheme = IdentityConstants.ExternalScheme;
})
В вашем Startup.ConfigureServices
есть следующее: также устанавливает схему аутентификации по умолчанию:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
Из-за порядка, в котором это определено (AddIdentity
равно после AddAuthentication
), значение по умолчанию меняется с Jwt на Identity, поэтому при использовании [Authorize]
процесс проверки подлинности теперь ожидая использовать Identity, а не Jwt.
Для решения этой проблемы простейшим вариантом является переключение порядка AddIdentity
и AddAuthentication
, чтобы вызов JwtBearer был последним и, следовательно, "выигрывал". Вы также должны быть более точными и установить DefaultAuthenticateScheme
и DefaultChallengeScheme
:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(...);
Другим вариантом является явное указание в атрибуте [Authorize]
, вызывая , какую схему аутентификации вы хотите использовать, как любую из следующих двух строк:
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[Authorize(AuthenticationSchemes = IdentityConstants.ApplicationScheme)]
Кажется, что первый вариант будет наиболее подходящим для вашего варианта использования, но хорошо знать, что этот второй вариант существует, если он вам нужен, когда вы идете дальше с Identity (есть и другие - например, с использованием политик).