我正在测试 IdentityServer4,通过文档以了解有关 OAuth2、OpenId Connect 和基于声明的身份验证的更多信息,所有这些都是我的新手。但是,一些示例代码的行为很奇怪,我不明白为什么......
因此,根据我的理解,当获得访问用户数据的权限时,客户端可以访问 UserInfo 端点,其中包含声明等数据。
在 IdentityServer4 中,甚至还有一个设置
GetClaimsFromUserInfoEndpoint
文档建议我们设置为 true。
因此,我正在遵循 IdentityServer4 启动指南,并且一切正常,直到某一点为止。 This Quickstart包含提供的示例代码,尽管我假设我遗漏了一些明显的内容并且不需要查看代码。
基于运行服务器的openId配置页面,userinfo端点位于
http://localhost:5000/connect/userinfo当我尝试通过浏览器访问它时,我看到一个声称我已登录的导航栏,但页面正文是一个登录提示。看起来很奇怪,但我假设这是因为我在 localhost:5000 (IdentityServer4) 上登录,但我没有发送我在 localhost:5002 上为客户端获得的 userId token 。
所以我在我的客户端应用程序上编写了以下代码:
public async Task<IActionResult> GetData()
{
var accessToken = HttpContext.Authentication.GetTokenAsync("access_token").Result;
HttpClient client = new HttpClient();
client.SetBearerToken(accessToken);
var userInfo = await client.GetStringAsync("http://localhost:5000/connect/userinfo");
return Content(userInfo);
}
在这里,我知道 GetTokenAsync("access_token") 应该可以正常工作,因为它在示例项目的其他地方由连接到 API 的客户端应用程序使用。但是,我得到的响应再次是 IdentityServer 的布局页面和登录提示。
知道我的错误是什么以及如何访问 UserInfo 端点吗?
编辑:删除线程阻塞,这样我就不会向陌生人展示可耻的测试代码
好的,原来这段代码应该有一个简化版本,即:
UserInfoClient uic = new UserInfoClient("http://localhost:5000", idToken);
var result = await uic.GetAsync();
return Content(JsonConvert.SerializeObject(result.Claims));
然而,问题仍然存在,甚至 UserInfoClient 中封装的代码也遇到了“没有用户端点数据,只有示例网站的布局”的砖墙。
最佳答案
现在回答可能有点晚了,但是对于仍然遇到此问题的任何人,请尝试这个 ---
var accessToken = await HttpContext.Authentication.GetTokenAsync("access_token");
var client = new HttpClient();
client.SetBearerToken(accessToken);
var userInfoClient = new UserInfoClient("http://localhost:5000/connect/userinfo");
var response = await userInfoClient.GetAsync(accessToken);
var claims = response.Claims;
您还可以在客户端应用程序上获取声明列表,例如 -
var claims = HttpContext.User.Claims.ToList();
无需调用端点。
关于asp.net-core - 无法从客户端访问 IdentityServer4 文档示例中的 UserInfo 端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41594261/