app.UseAuthentication();
Это то, что регистрирует промежуточное ПО аутентификации, которое в конечном итоге будет искать токен JWT Bearer во входящем HTTP-запросе и которое будет использовать его для аутентификации пользователя на основе этого значения.
Поскольку это промежуточное программное обеспечение является зарегистрированным первым промежуточным программным обеспечением, оно также будет работать в качестве первого промежуточного программного обеспечения, прежде чем что-либо еще в вашем конвейере будет запущено. Поскольку вызов app.UseSiteRouteMiddleware()
происходит позже, ваше пользовательское промежуточное ПО, которое будет изменять входящий HTTP-запрос, также будет запущено позже. Таким образом, он изменит запрос после того, как он уже был использован в целях аутентификации.
Если вы хотите, чтобы аутентификация происходила после возможности переписать HTTP-запрос, вам придется переместить app.UseSiteRouteMiddleware()
перед вызовом app.UseAuthentication()
.
Обратите внимание, что поскольку ваше пользовательское промежуточное ПО использует сеанс, промежуточное программное обеспечение сеанса также должно запускаться раньше, чем ваше пользовательское промежуточное ПО. В конце концов, ваш поток должен работать так:
- Получение информации о сеансе (промежуточное программное обеспечение сеанса)
- Настройка заголовков HTTP-запросов (SiteRouteMiddleware)
- Аутентификация пользователя (промежуточное ПО аутентификации)
Итак, вы должны настроить эти три промежуточных программного обеспечения в следующем порядке:
app.UseSession();
app.UseSiteRouteMiddleware(getRoutes);
app.UseAuthentication();
При этом, ваш подход к хранению JWT довольно неконвенален . Обычно предполагается, что аутентификация с использованием токена-носителя не имеет состояния, поскольку клиент явно передает токен, необходимый для аутентификации пользователя. Это отличается от обычной аутентификации на основе файлов cookie, когда данные неявно передаются через файл cookie в рамках запроса.
По иронии судьбы, вы используете промежуточное программное обеспечение сеанса для хранения токена-носителя JWT, что делает именно это: по умолчанию промежуточное программное обеспечение сеанса использует сеанс cookie для возобновления предыдущего сеанса пользователя. Итак, с вашим решением вы в основном использовали другой файл cookie для включения аутентификации.
Если у вас нет действительно веской причины для такого дизайна, я настоятельно рекомендую вам переключиться на стандартную проверку подлинности с использованием cookie, которая будет просто хранить идентификационные данные в cookie, а не сохранять их в веб-токене JSON. Это, вероятно, также, как правило, уменьшает сложность вашей настройки аутентификации, делая ее намного лучше поддерживаемой. В то же время вы также потеряете требование использовать дополнительное управление сеансами, которое часто рекомендуется (опять же, если у вас нет веских причин).
Если вам нужна «обычная» аутентификация на носителе JWT, например, если к вашему приложению также обращается клиент API, то обратите внимание, что нет ничего плохого в том, что в аутентификации на носителе JWT и есть ваше приложение. Таким образом, у вас есть свобода выбора любого стиля аутентификации, который лучше всего подходит для каждого случая.