@skylex3
Просто учусь программированию, так что вот:)

Как передать токен в заголовок?

Есть метод который создает токен:
[HttpPost]
public IActionResult Login(LoginViewModel model)
{
    var data = _users.FirstOrDefault(u => u.Name == model.Name && u.Password == model.Password);
    if(data == null)
        return Unauthorized();
    var claim = new List<Claim>() { new Claim(ClaimTypes.Name, data.Name!) };

    var jwt = new JwtSecurityToken(
            issuer : AuthOption.ISSUER,
            audience : AuthOption.AUDIENCE,
            claims : claim,
            expires : DateTime.UtcNow.Add(TimeSpan.FromMinutes(2)),
            signingCredentials : new SigningCredentials(AuthOption.GetSymmetricSecurityKey(), SecurityAlgorithms.HmacSha256)
        );

    var token = new JwtSecurityTokenHandler().WriteToken(jwt);
    HttpContext.Session.SetString("token", token);

    return RedirectToAction("Data");
}


Есть MiddleWare который по сути должен устанавливать заголовок
readonly RequestDelegate _next;
 public RoutingMiddleware(RequestDelegate next) => _next = next;

 HttpClient _httpClient = new();
 public async Task InvokeAsync(HttpContext context)
 {
     string? token = context.Session.GetString("token");
     if (token is not null)
     {
         _httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
         _httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
     }
     await _next.Invoke(context);
 }


Но почему то после того, когда пользователь проходит авторизацию, и пытается перейти на страницу /Data, ему отказывает в доступе
[Authorize]
public IActionResult Data()
{
    return Json("Syca blyt");
}


Заранее благодарю за помощь :)
  • Вопрос задан
  • 362 просмотра
Пригласить эксперта
Ответы на вопрос 1
AshBlade
@AshBlade
Просто хочу быть счастливым
Ты используешь [Authorize] атрибут из фреймворка для авторизации, но при этом не следуешь правилам, чтобы фреймворк понял, что клиент авторизован. Как минимум - откуда он узнает, что токен для авторизации находится именно в куках с именем token?

В HttpContext есть метод SignInAsync. Этот токен нужно передавать туда, а не в куки. Дополнительно, нужно правильно настроить процесс авторизации.

Держи туториал по JWT авторизации

if (token is not null)
     {
         _httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
         _httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
     }

- Этот код не имеет смысла, так как заголовок выставляется для созданного _httpClient, а не в запросе (дополнительно, Middleware - синглтон, а _httpClient у тебя один, он не может делать параллельные запросы)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы