加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-core – 无法从Client访问IdentityServer4 doc示例中的U

发布时间:2020-12-16 07:42:15 所属栏目:asp.Net 来源:网络整理
导读:我正在测试IdentityServer4,浏览文档以了解有关OAuth2,OpenId Connect和基于声明的身份验证的更多信息,所有这些都是我的新手.但是,一些示例代码表现得很奇怪,我无法弄清楚为什么…… 因此,根据我的理解,当获得访问用户数据的权限时,客户端可以访问UserInfo端
我正在测试IdentityServer4,浏览文档以了解有关OAuth2,OpenId Connect和基于声明的身份验证的更多信息,所有这些都是我的新手.但是,一些示例代码表现得很奇怪,我无法弄清楚为什么……

因此,根据我的理解,当获得访问用户数据的权限时,客户端可以访问UserInfo端点,其包含诸如声明等的数据.

在IdentityServer4中甚至还有一个设置

GetClaimsFromUserInfoEndpoint

文档建议我们将其设置为true.

所以我遵循IdentityServer4启动指南,一切都运行良好,直到一个点. This Quickstart包含提供的示例代码,虽然我假设我遗漏了一些明显的东西并且看不到代码.

基于正在运行的服务器的openId Configuration页面,userinfo端点位于
http://localhost:5000/connect/userinfo当我尝试通过浏览器访问它时,我看到一个声称我已登录的导航栏,但页面正文是一个登录提示.看起来很奇怪,但我假设这是因为我登录localhost:5000(IdentityServer4),但我没有发送我在localhost:5002上为客户端获取的userId令牌.

所以我在我的客户端应用程序上编写了以下代码:

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();

没有调用端点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读