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不一致