【问题标题】:Resource Owner Credentials Flow with JavaScript and IdentityServer - Not Allowed?使用 JavaScript 和 IdentityServer 的资源所有者凭证流 - 不允许?
【发布时间】:2016-01-03 06:25:01
【问题描述】:

我有一个 JS 网站,它试图通过传递用户名和密码来获取访问令牌。我还维护身份验证服务器,因此我认为 JS 客户端是受信任的。我可以用 ASP.net 4.5.x 做到这一点。但是当我尝试对 IdentityServer 做同样的事情时,我得到了 invalid_client。

我现在正在试用 ASP.net 5,并且我相信不再支持用作身份提供者的旧 OWIN 中间件,并且当我们想成为身份提供者时,他们正在提倡 IdentityServer。

POST /connect/token HTTP/1.1
Host: localhost:59766
Content-Type: application/x-www-form-urlencoded

username=admin&password=pw&grant_type=password

我认为 IdentityServer 首先需要客户端信息,但这意味着我必须在网页(或本机移动应用程序)上公开 client_secret,我认为根据 OAuth 规范这是不允许的。

我们如何使用 IdentityServer 关闭客户端需求?

在 IdentityServer 的 github 上,我只看到 C# 代码收集客户端凭据以及用户名和密码以获取资源所有者凭据流 here 的访问令牌。什么是等效的原始 HTTP 请求?

我个人不在乎是否有其他应用试图冒充我的客户。无论如何,实际上是用户的凭据才允许访问任何内容。

【问题讨论】:

  • 注意:如果您正在 ASP.NET 5 中寻找 OAuthAuthorizationServerMiddleware 的等效项(OWIN/Katana/Web API 中的 OAuth2 授权服务器),您可以试试 AspNet.Security.OpenIdConnect.Server: stackoverflow.com/questions/30768015/…。它支持您尝试实现的确切场景,无需客户端身份验证。
  • 我试过了,但我似乎无法让令牌生成器编写 JWT 的第三部分。我会在以后的问题中问这个问题。

标签: asp.net-web-api asp.net-core asp.net-core-mvc thinktecture-ident-server identityserver3


【解决方案1】:

在 IdentityServer3 中,客户端身份验证是强制性的:如果请求中缺少客户端凭据,则令牌请求无法验证,无论您使用哪种授权类型(授权代码、刷新令牌、资源所有者密码)。

当然,这并不真正符合规范,因为像 JS 应用程序这样的公共应用程序不需要客户端身份验证,但我想这个要求是为了鼓励您改用隐式流程 (https://www.rfc-editor.org/rfc/rfc6749#section-4.3.2)

如果您真的想将 ROPC 与 IdentityServer 一起使用,您可以使用其他 OAuth2 参数传输客户端凭据:

POST /connect/token HTTP/1.1
Host: localhost:59766
Content-Type: application/x-www-form-urlencoded

client_id=id&client_secret=not_secret_at_all&username=admin&password=pw&grant_type=password&scope=read+write

【讨论】:

  • 以上还是不行。我仍然用 invalid_client 得到 400。我将客户的流程设置为资源所有者。
  • 确保同时指定一个“范围”参数。我在没有明确范围的情况下尝试过,但确实失败了。
  • 你们知道一个 javascript 库可以像我们使用 oidc-client 一样使用 ROPC 针对身份服务器吗?
猜你喜欢
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 2019-01-03
  • 2014-03-31
  • 2015-01-06
  • 2017-05-18
  • 1970-01-01
  • 2015-08-16
相关资源
最近更新 更多