用户已通过身份验证,但访问令牌在哪里?

时间:2018-05-28 12:20:43

标签: c# asp.net-core-mvc identityserver4

我有一个Web应用程序,它使用隐式客户端向Identity Server 4验证用户身份。我需要此用户的访问令牌,以便我可以调用另一个API。

要明确:

  1. 我有一个身份服务器。使用Identity server 4创建。
  2. 我在Asp .net core mvc中创建了有问题的网络应用程序。
  3. 在.net核心中创建的API。
  4. Web应用程序针对身份服务器对用户进行身份验证。一旦对它们进行了身份验证,我们就会使用承载令牌来访问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();
    

    如何为当前经过身份验证的用户找到访问令牌?使用隐式登录。

    关于混合与隐式登录的注意事项:由于此处发布的问题,我无法使用混合登录Authentication limit extensive header size由于我无法找到该问题的解决方案,建议切换到隐式登录而不是混合。隐含似乎并没有创造出杂交所做的巨型烹饪。

    我一直在关注这个以创建隐式客户端Getting started with Identityserver 4

2 个答案:

答案 0 :(得分:4)

默认情况下,OpenID Connect中间件only requests an identity tokenresponse_type的{​​{1}})。

您需要先使用以下内容更新id_token

OpenIdConnectOptions

然后,您可以使用以下方法将令牌保存到您的Cookie中

options.ResponseType = "id_token token";

最后,您可以使用以下方式访问令牌:

options.SaveTokens = true;

请注意,在使用隐式流时,您还需要在IdentityServer客户端配置中设置await HttpContext.GetTokenAsync("access_token"); 标志。

答案 1 :(得分:1)

使用options.SaveTokens = true 然后从声明中获取访问令牌或使用HttpContext.GetTokenAsync 这是博客帖子的链接,例如:https://www.jerriepelser.com/blog/accessing-tokens-aspnet-core-2/