Сбой аутентификации с "Сбой снятия защиты с билета" для Asp.Net Core WebApi
Когда я использую токен Bearer с контроллером AspNetCore, защищенным [Authorize]
, Я получаю сообщение журнала:
info: Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler[7]
Identity.Application was not authenticated. Failure message: Unprotect ticket failed
Я пытаюсь понять, что это значит и что может быть причиной этого.
Startup
Класс API имеет следующую настройку. Api использует AspNet Identity Core.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<UserAccountDbContext>(options => options.UseSqlServer(connectionString,
sql => sql.MigrationsAssembly(MigrationsAssembly)));
services.AddIdentity<UserAccount, IdentityRole>()
.AddEntityFrameworkStores<UserAccountDbContext>();
services.AddTransient<UserManager<UserAccount>>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddAuthorization();
services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options =>
{
options.Authority = _configuration.OAuth2.ServerUri;
options.RequireHttpsMetadata = false;
options.Audience = "api";
});
}
А также:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseAuthentication();
app.UseMvc();
}
Ответ вызывающей стороне - Несанкционированный (401) без объяснения причин.
РЕДАКТИРОВАТЬ:
Я думаю, что это как-то связано с куки-файлами, как указано в комментарии. Я вижу печенье Identity.Application
, Я очистил это и попытался, но не помог. Я думаю, это может быть связано с тем, как настроены мой токен-сервер и сервер Api (оба используют AspNet Identity).
У меня есть один проект Mvc, работающий в качестве Idp на localhost:5000. Тогда мой менеджер пользователей Api, который имеет защищенный контроллер, размещается на localhost:5001. Когда я пытаюсь получить доступ к защищенному контроллеру, меня перенаправляют на страницу входа в проект IdP (который, как мне кажется, устанавливает cookie). Затем я пытаюсь использовать токен с контроллером, я получаю вышеупомянутую ошибку.
Если я удаляю файлы cookie между получением токена и совершением вызова Api, я получаю следующий журнал:
2019-02-11 23:35:15.3711 [INFO] Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'.
info: Microsoft.AspNetCore.Mvc.ChallengeResult[1]
Executing ChallengeResult with authentication schemes ().
2019-02-11 23:35:15.3711 [INFO] Executing ChallengeResult with authentication schemes ().
info: Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler[12]
AuthenticationScheme: Identity.Application was challenged.
2019-02-11 23:35:15.3711 [INFO] AuthenticationScheme: Identity.Application was challenged.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
3 ответа
Когда я запускал сервер разработки на порту 5000, я также получал сообщение об ошибке "Сбой при снятии защиты с билета". В Chrome у меня было несколько файлов cookie из другого проекта, который также работал на 5000. Удалил все файлы cookie, и сообщение об ошибке исчезло.
Я не помню точно, что я сделал, чтобы решить это. И я не совсем могу объяснить ответ, потому что это было давно. По сути, я просмотрел множество примеров IdentityServer4 и документацию Microsoft и совместил приведенное ниже. Посмотри, работает ли это.
services.AddAuthentication(options => options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.Audience = "api";
});
Вместо:
services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options =>
{
options.Authority = _configuration.OAuth2.ServerUri;
options.RequireHttpsMetadata = false;
options.Audience = "api";
});
Это может произойти, если вы распределили трафик между двумя веб-серверами и не настроили защиту данных для совместного использования ключей.
Подробнее ниже: