Сбой аутентификации с "Сбой снятия защиты с билета" для 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";
                                            });

Это может произойти, если вы распределили трафик между двумя веб-серверами и не настроили защиту данных для совместного использования ключей.

Подробнее ниже:

Токен защиты от подделки не может быть расшифрован

Другие вопросы по тегам