Пользователь аутентифицирован, но где токен доступа? - PullRequest
0 голосов
/ 28 мая 2018

У меня есть веб-приложение, которое аутентифицирует пользователя на Identity Server 4, используя неявного клиента.Мне нужен токен доступа для этого пользователя, чтобы я мог позвонить другому API.

Для ясности:

  1. У меня есть идентификационный сервер.Создано с использованием сервера удостоверений 4.
  2. У меня есть соответствующее веб-приложение, созданное в Asp .net core mvc.
  3. API, созданный в ядре .net.

Веб-приложение аутентифицирует пользователя на сервере идентификации.Как только они аутентифицируются, мы используем токены-носители для доступа к API.

 services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

 services.AddAuthentication(options =>
            {
                options.DefaultScheme = "cookie";
                options.DefaultChallengeScheme = "oidc";
            })
            .AddCookie("cookie")
            .AddOpenIdConnect("oidc", options =>
            {
                options.Authority = Configuration["ServiceSettings:IdentityServerEndpoint"];
                options.ClientId = "f91ece52-81cf-4b7b-a296-26356f50841f";
                options.SignInScheme = "cookie";
            });

Пользователь в порядке аутентификации, и я могу получить доступ к контроллеру ниже.Мне нужен токен доступа для этого пользователя, чтобы я мог сделать запрос к другому API.

[Authorize]
public async Task<IActionResult> Index(int clientId, string error)
{
        ViewData["Title"] = "Secrets";

        if (User.Identity.IsAuthenticated)
        {

         // All of the below attempts result in either null or empty array
         var attempt1 = Request.Headers["Authorization"];
         var attempt2 = await HttpContext.GetTokenAsync("access_token");
         var attempt3 = _httpContextAccessor.HttpContext.Request.Headers["Authorization"];

         var attempt4 = await _httpContextAccessor.HttpContext.GetTokenAsync("access_token");

        }
        return View();
    }

Следующее содержит заголовок с именем cookie.Есть ли способ получить токен доступа из этого?

  var h = _httpContextAccessor.HttpContext.Request.Headers.ToList();

Как найти токен доступа для текущего аутентифицированного пользователя?Использование неявного входа в систему.

Примечание о гибридном и неявном входе в систему: я не могу использовать гибридный вход в систему из-за проблемы, указанной здесь Аутентификация ограничивает обширный размер заголовка Поскольку я не смог найти решение дляэтой проблемой было предложение перейти на неявный логин, а не гибридный.Похоже, неявное создание гигантской кулинарии, которую сделал гибрид.

Я следил за этим, чтобы создать неявного клиента Начало работы с Identityserver 4

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

По умолчанию промежуточное программное обеспечение OpenID Connect запрашивает только идентификационный токен (response_type из id_token).

Сначала вам нужно обновить OpenIdConnectOptions следующим образом:

options.ResponseType = "id_token token";

Затем вы можете сохранить токены в своем файле cookie, используя:

options.SaveTokens = true;

И, наконец, вы можете получить доступ к токену, используя:

await HttpContext.GetTokenAsync("access_token");

Обратите внимание, что вам также потребуется установить флаг AllowAccessTokensViaBrowser в конфигурации клиента IdentityServer при использовании неявного потока.

0 голосов
/ 29 мая 2018

Используйте опции

...