Расположение пользовательского токена для JwtBearerMiddleware

У нас есть вызывающий клиент, запрашивающий нашу систему, который не размещает токен Bearer в стандартном месте (заголовок «Авторизация»). Я хотел бы создать собственный обработчик, который ищет JWT в правильном месте. Помимо разветвления реализации JwtBearerMiddleware, есть ли более чистый способ просто указать промежуточному программному обеспечению, какой обработчик использовать?

Более простым вариантом было бы просто переписать запрос, внедрив JWT в правильное место (заголовок запроса) в конвейере запросов непосредственно перед запуском промежуточного программного обеспечения JWT. Но это кажется немного хакерским.


person Lutando    schedule 31.01.2017    source источник


Ответы (1)


На самом деле есть встроенный способ сделать это без необходимости разветвления кода или попытки предоставить свой собственный обработчик. Все, что вам нужно сделать, это подключить некоторый код к событию OnMessageReceived:

app.UseJwtBearerAuthentication(new JwtBearerOptions()
{
    Events = new JwtBearerEvents()
    {
        OnMessageReceived = context =>
        {
            // Get the token from some other location
            // This can also await, if necessary
            var token = context.Request.Headers["MyAuthHeader"];

            // Set the Token property on the context to pass the token back up to the middleware
            context.Token = token;

            return Task.FromResult(true);
        }
    }
});

Если вы посмотрите на source свойство Token проверяется после выполнения обработчика события. Если он нулевой, то обработчик продолжает проверку по умолчанию для заголовка авторизации.

person Nate Barbettini    schedule 31.01.2017
comment
Большое спасибо за это. Я просмотрел источник, но не соединил два и два в строке кода, которую вы связали. Работает как шарм. Для всех, кто заинтересован, мне нужно добавить токен Bearer в строку запроса, потому что мы используем SignalR (мы не хотим использовать файлы cookie) и вместо этого хотим извлечь токен из строки запроса. - person Lutando; 31.01.2017
comment
@Lutando Рад помочь! - person Nate Barbettini; 31.01.2017