asp.net-core - 无法从客户端访问 IdentityServer4 文档示例中的 UserInfo 端点

标签 asp.net-core openid-connect identityserver4

我正在测试 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/

相关文章:

c# - 静默刷新在 OPTIONS 预检上进行身份验证,但不在 GET 到 UserInfo 端点上进行身份验证

kvm - 为 Asp.Net VNext 安装 KVM

c# - .net-core 中间件返回空白结果

c# - 如何在 Ubuntu 上运行依赖于 NuGet 包的 .net Core 应用程序

go - 配置 Keycloak 以在 id token 中包含 at_hash 声明

asp.net-core - 身份服务器 - 使用刷新 token 获取更新的声明

c# - 将 GeoJson 特征映射到属性

openid-connect - 尝试将 OIDC OnRedirectToIdentityProvider 从 302 更改为 401

kubernetes - 为什么我在 GKE 上而不是在本地运行时从 OAuth2 代理获得 CSRF 403?

c# - 带有 IdentityServer4 的 Blazor(服务器端)