Передать полученный токен от одного сервиса другому

0

У меня есть довольно простой случай использования:

  • Владелец ресурса использует мой Угловой клиент для получения токена JWT от IDP
  • Угловые клиентские вызовы Служба A (WebAPI) с маркером доступа, выданным IDP
  • Угловой клиент вызывает услугу B (WebAPI) с токеном доступа, выпущенным IDP

Я хотел бы поддержать следующий сценарий:

  • Служите А, действуя как Угловой клиент, и передайте токен доступа, полученный им, чтобы позвонить в Службу B

Таким образом, в основном, услугу B можно называть либо напрямую, либо с помощью углового клиента, либо службой А. В обоих случаях для доступа к любой из конечных точек WebAPI должен быть предоставлен токен-носитель.

От службы А я не знаю, как хранить предоставленный маркер так, что позже, когда мне нужно использовать HttpClient для вызова Service BI можно установить Bearer заголовок.

  • 0
    Можете ли вы уточнить, зачем вам нужно хранить токен на стороне сервера? Вам нужно выполнять запросы без вмешательства пользователя (например, запланированные задачи)?
  • 0
    Предположим, что Сервис B предоставляет некоторые функциональные возможности, от которых зависит Сервис А. Поэтому, когда пользователь вызывает Сервис A, я хотел бы вызвать Сервис B, используя тот же токен (из Сервиса A). Таким образом, в основном Служба A использует токен для того, что ему нужно, а затем передается через токен в Службу B.
Теги:
asp.net-web-api
identityserver3

1 ответ

1
Лучший ответ

Если я правильно понял, ваше требование - вызывать второй API (услугу B) как часть одного запроса к службе A от аутентифицированного пользователя.

Если это так, то я считаю, что нет никакой причины хранить маркерную сторону сервера, и вы можете просто взять заголовок Authorization из текущего запроса и повторно использовать его для вызова службы B.

Некоторый код может помочь объяснить, что я имею в виду, предполагая, что ControllerA является ControllerA Service A:

public class ControllerA : ApiController
{
    public async Task<IHttpActionResult> GetFromB()
    {
        var token = Request.Headers.Authorization.Parameter;

        MyModel result = null;

        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Authorization =
                new AuthenticationHeaderValue("Bearer", token);

            var response = await client.GetAsync("http://serviceb/controllerb/actionb");
            response.EnsureSuccessStatusCode();
            result = await response.Content.ReadAsAsync<MyModel>();
        }

        return Ok(result);
    }
}
  • 0
    Да, это именно то, что мне нужно. Я не осознавал, что промежуточное ПО OWIN хранит информацию об авторизации. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню