identityserver 4 获取当前用户的 access_token

Posted

技术标签:

【中文标题】identityserver 4 获取当前用户的 access_token【英文标题】:identityserver 4 get current user's access_token 【发布时间】:2018-11-21 04:39:41 【问题描述】:

我无法获取当前用户的 access_token。 这是我的设置:

在 aspnet 核心、身份和 EF 存储中的 QuickstartIdentityServer (QIS) NodeJs 中的 API (API)。根据 QIS 验证标头中的 jwt 令牌。 与 QIS 和 API 配合使用的 SPA Angular 应用程序超出了本问题的范围

在 QuickstartIdentityServer (QIS) 站点(用户详细信息页面)的一部分中,我想使用 access_token 调用 API 端点来验证请求。我正在努力从我的 QIS 站点检索当前用户的 access_token。每当我调用HttpContext.GetTokenAsync("access_token") 时,我都会得到一个空值。我看过 IdSrv4 文档的这一部分:https://identityserver4.readthedocs.io/en/release/quickstarts/5_hybrid_and_api_access.html?highlight=gettokenasync,但它似乎适用于 MVC 客户端而不是我自己的身份服务器。

任何人都可以阐明如何获取我的用户的 access_token 吗?

谢谢

编辑

这是尝试更好地解释我的问题的起点: https://github.com/IdentityServer/IdentityServer4.Samples/tree/release/Quickstarts/6_AspNetIdentity/src/IdentityServerWithAspNetIdentity

从这个 QIS 项目开始,我想获取登录用户的访问令牌。因此,例如,如果我编辑 HomeController 以添加此调用:

public async Task<IActionResult> Index()

     var accessToken = await HttpContext.GetTokenAsync("access_token");
     return View(accessToken);

然后我就可以在 Auth Header 中使用这个令牌调用我的 NodeJS API。

希望这能更好地解释我的问题。

【问题讨论】:

请提供一些代码如何设置您的 IdentityServer 或您正在使用哪个 QIS(github 链接?)。另外,您在请求链的哪个位置尝试访问 access_token?例如。 SPA 调用 API,它返回一个重定向到 QIS 中的 UserDetails 页面。这个调用是在 Get 还是 Post 中?提供一些代码将帮助我们回答您的问题。 您可能需要考虑通过扩展授权使用委托。 identityserver4.readthedocs.io/en/release/topics/…. Identity Server 仅为客户端(而不是自身)发出 access_token。我相信它会发出 id_token 供自己使用,但不确定它是否存储在 cookie 中。您可以通过在 QIS 项目中尝试var token = await HttpContext.GetTokenAsync("id_token"); 来检查它是否存在。 你说得对,看来我必须创建一个带 ClientCredentials 授权类型的专用客户端。我本来希望“模拟”当前用户来调用 API,但我将通过服务到服务身份验证来解决这个问题。谢谢你的帮助。我会尽快发布我的解决方案 【参考方案1】:

因此,我设法使用专用客户端通过客户端凭据授权和以下调用通过我的 API 对自己进行身份验证,以获取 access_token:

        var disco = await DiscoveryClient.GetAsync("http://localhost:5000");
        var tokenClient = new TokenClient(disco.TokenEndpoint, clientId, clientSecret);
        var tokenResponse = await tokenClient.RequestClientCredentialsAsync(scope);

然后我可以将tokenResponse中返回的access_token添加到我的请求标头到API:

        using(var client = new HttpClient()) 
          client.SetBearerToken(tokenResponse.AccessToken);
          ...
          // execute request
        

缺点是我无法在 API 端“模拟”当前登录的 IS。

【讨论】:

以上是关于identityserver 4 获取当前用户的 access_token的主要内容,如果未能解决你的问题,请参考以下文章

IdentityServer4:如何为 Google 用户设置角色?

如何从 identityServer4 的现有数据库中获取用户

通过 IdentityServer 认证后如何获取 WebAPI 控制器上的用户信息?

identityserver4 踩坑之不同API的ClaimsPrincipal获取用户信息的Type不一致

如何在 identityserver4 中没有用户名和密码的情况下从令牌端点获取令牌?

有没有办法撤销另一个用户的访问令牌并结束他们在 Identity Server 4 中的会话?