У меня есть простой метод "ворот", который определяет, действителен ли токен jwt пользователя, а затем перенаправляет его на какое-то действие
У меня есть две конечные точки, требующие авторизации,
Один из них используется только для определения того, в порядке ли токен (возвращает 401, если нет, или OK, если это так)
Вторая - это защищенная область, для которой требуется действующий токен.
Моя проблема в том, что первая конечная точка возвращает этот токен в порядке, но вторая возвращает 401
Из-за "обходного пути", который заключается в возврате представления вместо действия.
Я понял, что забыл про заголовок авторизации, но
how to add headers to redirect to action?
Это отчасти важно для return redirect to action
вместо View, потому что с View браузер показывает старый URL, который в данном случае localhost/Gate
вместо localhost/Authorized
.
public async Task<IActionResult> Gate()
{
var token = ExtractToken();
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}");
var get = client.GetAsync($"https://localhost:12345/TokenValidator").Result;
switch (get.StatusCode)
{
case HttpStatusCode.Unauthorized:
return RedirectToAction("Unauthorized");
case HttpStatusCode.OK:
return RedirectToAction("Authorized"); // it enters this case
default:
return RedirectToAction("Index");
}
}
[Route("TokenValidator")]
[Authorize]
public IActionResult TokenValidator()
{
return new OkObjectResult("OK");
}
[Route("Authorized")]
[Authorize]
public IActionResult Authorized()
{
return View();
}
@alsami хорошо, я знаю, что это не самое лучшее решение, но у меня не было других идей, но что на самом деле может пойти не так?
Для этого вы должны использовать промежуточное ПО, а не выполнять внутреннюю маршрутизацию от действия к действию к другому действию.
Спасибо Жан-Франсуа Фабру за удаление моего комментария.
Иногда старый комментарий в неразрешенном посте помогает оживить дискуссию.
Для интересующихся следите за ответом.
В Startup.cs (Настроить) Добавьте код:
app.UseSession();
app.Use(async (context, next) =>
{
var JWToken = context.Session.GetString("JWToken");
if (!string.IsNullOrEmpty(JWToken))
{
context.Request.Headers.Add("Authorization", "Bearer " + JWToken);
}
await next();
});
И в View после проверки токена:
HttpContext.Session.SetString("JWToken", post.AccessToken);
Затем вы можете продолжить процесс в обычном режиме.
Я использую RedirectToAction:
return RedirectToAction(actionName: "Default", controllerName: "Usuario");
Объятия
Это очень плохая практика. Напишите собственный обработчик авторизации, как предполагается, или, что еще лучше, используйте сборку для JWT. developer.okta.com/blog/2018/03/23/…docs.microsoft.com/en-us/aspnet/core/security/authorization/…