Как добиться успеха и продолжить выполнение запроса внутри событий JwtBearer.Событие с отменой проверки подлинности

#c# #asp.net-core #jwt #asp.net-core-webapi #middleware

Вопрос:

В моем проекте у меня есть два типа аутентификации: первый-через JWT, а второй все равно будет реализован.

В случае ошибки с аутентификацией JWT мне нужно вызвать второй тип аутентификации, а в случае успеха продолжить вызов контроллера.

Однако обработка события OnAuthenticationFailed не работает.

Как добиться успеха внутри события OnAuthenticationFailed?

Это не работает

 services.AddAuthentication(BearerAuthenticationDefaults.AuthenticationScheme)
           .AddJwtBearer(options =>
           {
               options.Authority = configuration.GetSection("AuthenticationConfiguration").GetValue<string>("Authority");
               options.TokenValidationParameters = new TokenValidationParameters()
               {
                   ValidateAudience = false
               };
               options.Events = new JwtBearerEvents()
               {
                   OnAuthenticationFailed = c =>
                   {
                       //here a second authentication will be implemented

                       //(if secondauthentication.IsSucess)
                       c.Exception = null;
                       c.Success();

                       return Task.CompletedTask;
                   }
               };
           });
 

Ответ №1:

В Asp.net приложение может иметь несколько служб аутентификации. Вместо записи второго типа проверки подлинности в случае сбоя проверки подлинности первого рекомендуется зарегистрировать его в качестве промежуточного программного обеспечения для проверки подлинности.

Например, в следующем коде регистрируются службы аутентификации и обработчики для схем аутентификации файлов cookie и носителей JWT:

 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => Configuration.Bind("JwtSettings", options))
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => Configuration.Bind("CookieSettings", options));
 

Более подробную информацию об аутентификации вы можете найти в документе ниже:

Обзор ASP.NET Основная аутентификация

Ответ №2:

Попробуй это?

 options.Events = new JwtBearerEvents()
                {
                    OnAuthenticationFailed = c =>
                    {
                        var payload = new JObject
                        {
                            ["success"] = "ok",
                            ["error_description"] = "success"
                        };
                        c.Response.StatusCode = 200;
                        c.Response.ContentType = "text/plain";
                        return c.Response.WriteAsync(payload.ToString());
                    }
                };
 

введите описание изображения здесь

Комментарии:

1. Он возвращает 200, но запрос не поступает на контроллер!