Сбой аутентификации с «Сбой снятия защиты с билета» для Asp.Net Core WebApi - PullRequest
0 голосов
/ 11 февраля 2019

Когда я использую токен Bearer с контроллером AspNetCore, защищенным [Authorize], я получаю сообщение журнала:

info: Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler[7]
      Identity.Application was not authenticated. Failure message: Unprotect ticket failed

Я пытаюсь понять, что это означает и что может быть причиной этого.

Класс Api Startup имеет следующую настройку.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).Затем я пытаюсь использовать токен с контроллером и получаю вышеупомянутую ошибку.

Если я удаляю куки между получением токена и совершением вызова 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]

Ответы [ 2 ]

0 голосов
/ 25 июля 2019

Проблема заключается в том, что URL-адрес обратного вызова передается как https, когда ваше приложение работает за обратным прокси-сервером или что-то похожее с использованием http, как упомянуто Крисом.Вот почему подход, описанный swdon, помогает.

Если вы работаете за обратным прокси-сервером (например, в веб-приложении Azure Linux или в Docker-контейнере), это должно помочь вам автоматически решить проблему в зависимости от того, где работает ваше приложение (ссылки на соответствующие проблемы указаны как встроенные).комментарии в коде):

// https://github.com/IdentityServer/IdentityServer4/issues/1331
var forwardOptions = new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto, RequireHeaderSymmetry = false
};
forwardOptions.KnownNetworks.Clear();
forwardOptions.KnownProxies.Clear();
// ref: https://github.com/aspnet/Docs/issues/2384
app.UseForwardedHeaders(forwardOptions);

Это необходимо разместить до app.UseAuthentication();

0 голосов
/ 18 марта 2019

Я не могу точно вспомнить, что я сделал, чтобы решить эту проблему.И я не совсем могу объяснить ответ, потому что это было давно.По сути, я просмотрел множество примеров 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";
                                            });
...