#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));
Более подробную информацию об аутентификации вы можете найти в документе ниже:
Ответ №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, но запрос не поступает на контроллер!