Я использую WSO2 в качестве своего провайдера идентификации (IDP). Он помещает JWT в заголовок под названием «X-JWT-Assertion».
Чтобы передать это в ядро системы ASP. NET, я добавил событие OnMessageReceived
. Это позволяет мне установить token
на значение, указанное в заголовке.
Вот код, который мне нужно сделать (ключевая часть - последние 3 строки кода без скобок):
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie()
.AddJwtBearer(async options =>
{
options.TokenValidationParameters =
await wso2Actions.JwtOperations.GetTokenValidationParameters();
options.Events = new JwtBearerEvents()
{
// WSO2 sends the JWT in a different field than what is expected.
// This allows us to feed it in.
OnMessageReceived = context =>
{
context.Token = context.HttpContext.Request.Headers["X-JWT-Assertion"];
return Task.CompletedTask;
}
}
};
Все это прекрасно работает за исключением самого первого звонка после запуска службы. Чтобы было понятно, каждый звонок, кроме первого, работает именно так, как я хочу. (Он вставляет токен и обновляет объект User
так, как мне нужно.)
Но при первом вызове OnMessageReceived
не срабатывает. И объект User
в моем контроллере не настроен.
Я проверил HttpContext
для этого первого вызова, и заголовок "X-JWT-Assertion" находится в списке Request.Headers
(с JWT в этом). Но по какой-то причине событие OnMessageReceived
не вызывается для него.
Как я могу заставить OnMessageReceived
быть вызванным для первого вызова сервисной операции для моего сервиса?
ВАЖНОЕ ПРИМЕЧАНИЕ: Я понял, что проблема была async
await
в AddJwtBearer
. (См. Мой ответ ниже.) Это то, что я действительно хотел из этого вопроса.
Однако, поскольку вознаграждение не может быть отменено, я по-прежнему буду назначать вознаграждение любому, кто может показать способ использования AddJwtBearer
с async
await
там, где он ожидает фактического вызова HttpClient
, Или покажите документацию о том, почему async
await
не предполагается использовать с AddJwtBearer
.