我在获取当前用户的access_token时遇到问题。 这是我的设置:
- aspnet core、identity and EF storage 中的 QuickstartIdentityServer (QIS(
- NodeJs 中的 API (API(。根据 QIS 验证标头中的 jwt 令牌。
- 与QIS和API配合使用效果很好的SPA角度应用程序,超出了本问题的范围
在快速入门身份服务器 (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);
}
然后,我将能够在身份验证标头中使用此令牌调用我的 NodeJS API。
希望这能更好地解释我的问题。
因此,我设法使用专用客户端使用客户端凭据授予和以下调用来获取access_token,从而使用我的 API 对自己进行身份验证:
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。