ASP.NET Core — проблема авторизации токена между микросервисами приводит к ошибке 401 UnauthorizedC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 ASP.NET Core — проблема авторизации токена между микросервисами приводит к ошибке 401 Unauthorized

Сообщение Anonymous »

Я работаю над архитектурой микросервисов с использованием ASP.NET Core с двумя основными службами: AuthService для аутентификации и SearchService для обработки профессионального поиска.
Пользователи проходят аутентификацию через AuthService, и я хочу, чтобы SearchService получал данные пользователя из AuthService с использованием токена JWT, включенного в заголовок авторизации.
Когда я делаю запрос GET к SearchService, он пытается вызвать AuthService с токеном, но я продолжаю получать несанкционированную ошибку 401 от AuthService, в которой регистрируется сообщение «Нет авторизации». заголовок найден".
Вот ключевая часть моей настройки:

Код: Выделить всё

[Authorize]
[ApiController]
[Route("api/[controller]")]
public class ProfessionalSearchController : ControllerBase
{
private readonly ILogger
 _logger;
private readonly IHttpClientFactory _httpClientFactory;

public ProfessionalSearchController(ILogger logger, IHttpClientFactory httpClientFactory)
{
_logger = logger;
_httpClientFactory = httpClientFactory;
}

[HttpGet("search")]
public async Task SearchProfessionals([FromQuery] string specialisation)
{
var userId = User.FindFirst("uid")?.Value;

if (userId == null)
{
_logger.LogWarning("User ID not found in token");
return Unauthorized();
}

var patient = await GetUserById(userId);

if (patient == null)
{
_logger.LogWarning("Patient not found");
return NotFound("Patient not found.");
}

// Rest of the code...
}

private async Task GetUserById(string userId)
{
var token = Request.Headers["Authorization"].ToString();

if (string.IsNullOrEmpty(token))
{
_logger.LogWarning("No token provided.");
return null;
}

var client = _httpClientFactory.CreateClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", ""));

var response = await client.GetAsync($"http://localhost:5203/api/User/{userId}");

if (response.IsSuccessStatusCode)
{
return await response.Content.ReadFromJsonAsync();
}

var errorContent = await response.Content.ReadAsStringAsync();
_logger.LogWarning($"Failed to get user by ID {userId}, StatusCode: {response.StatusCode}, Error: {errorContent}");

return null;
}
}
Я попробовал:
  • Проверил, что токен содержит необходимые утверждения, включая роли.
  • Подтверждено, что заголовок авторизации в запросе SearchService к AuthService установлен как носитель {токен
  • Убедился, что обе службы совместно используют идентичные параметры проверки токена (эмитент, аудитория и ключ подписи).
  • Протестировал конечную точку в Postman, напрямую вызвав AuthService, который отлично работает с тем же токеном.
Журналы показывают, что AuthService не получает заголовок авторизации от SearchService, что приводит к ответу 401 Unauthorized.Вот конкретный журнал:

Код: Выделить всё

System.Net.Http.HttpClient.Default.LogicalHandler: Information:
Start processing HTTP request GET
http://localhost:5203/api/User/b4e60ba8-79fa-4c33-a862-
f60d06213d6b
System.Net.Http.HttpClient.Default.ClientHandler: Information:
Sending HTTP request GET http://localhost:5203/api/User/b4e60ba8-
79fa-4c33-a862-f60d06213d6b
BackendDocVillage.Startup: Information: Request Method: GET, Path:
/api/User/b4e60ba8-79fa-4c33-a862-f60d06213d6b
BackendDocVillage.Startup: Information: Received Token: Bearer
eyJhbGci..
BackendDocVillage.Startup: Information: Request Method: GET, Path:
/api/User/b4e60ba8-79fa-4c33-a862-f60d06213d6b
BackendDocVillage.Startup: Information: No Authorization header
found.
System.Net.Http.HttpClient.Default.ClientHandler: Information:
Received HTTP response headers after 38.9651ms - 401
System.Net.Http.HttpClient.Default.LogicalHandler: Information:
End processing HTTP request after 52.6424ms - 401
SearchService.Controllers.ProfessionalSearchController: Warning:
Failed to get user by ID b4e60ba8-79fa-4c33-a862-f60d06213d6b,
StatusCode: Unauthorized, Error:
SearchService.Controllers.ProfessionalSearchController: Warning:
Patient not found
Обе службы работают локально (

Код: Выделить всё

AuthService
на http://localhost:5203 и SearchService на http://localhost:5095).

Код: Выделить всё

AuthService
и SearchService настроены на использование аутентификации носителя JWT.

Подробнее здесь: https://stackoverflow.com/questions/791 ... -in-401-un
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»