【问题标题】:Programmatically requesting access token on behalf of user代表用户以编程方式请求访问令牌
【发布时间】:2018-05-29 13:12:01
【问题描述】:

我想在登录后以编程方式获取当前用户的访问令牌。我已经知道如何使用客户端凭据获取令牌,但我不知道如何代表用户获取令牌。

这是我尝试使用客户端凭据获得的结果:

var client = new TokenClient("http://localhost:34240/connect/token", "client", "secret", AuthenticationStyle.PostValues);
var token = client.RequestClientCredentialsAsync(scope: "api").GetAwaiter().GetResult();

我是否需要使用acr_values 为请求添加主题值?如果是,如何将其添加到返回的访​​问令牌中?

或者我需要改用code 授权类型吗?如果是,我如何以编程方式请求授权码?

或者还有其他我想念的方法吗?

如果有任何帮助,我将不胜感激。我检查了 IdentityServer 示例,但没有看到任何相关信息。

【问题讨论】:

标签: c# asp.net asp.net-mvc asp.net-core identityserver4


【解决方案1】:

查看Resource owner password 授权示例。基本上你做的几乎一样,就像你现在做的一样,但是你需要设置你的客户端使用ResourceOwnerPassword,而不是client credentials,然后你显示的代码更改为:

var client = new TokenClient("http://localhost:34240/connect/token", "client", "secret", AuthenticationStyle.PostValues);

var token = client.RequestResourceOwnerPasswordAsync("<username>", "<password>", scope: "api").GetAwaiter().GetResult();

通过这种方式,您代表用户获得了一个令牌。但请记住:

规范建议仅对“受信任”(或旧版)应用程序使用资源所有者密码授权。一般来说,当您想要对用户进行身份验证并请求访问令牌时,使用其中一种交互式 OpenID Connect 流程通常会好得多。

【讨论】:

  • 谢谢。我知道资源所有者密码流程,但在需要令牌时,用户已经登录,所以我宁愿不再进行身份验证。我正在寻找一种解决方案,我可以在其中获取带有用户 ID/用户名信息的令牌。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 2014-05-19
  • 2018-09-01
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多