使用JavaScript和IdentityServer的资源所有者凭据流程-不被允许?

3
我有一个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:https://dev59.com/questions/jl0a5IYBdhLWcg3wD08e#30857524。它支持您要实现的确切场景,而无需客户端身份验证。 - Kévin Chalet
我尝试过了,但好像无法让令牌生成器写入JWT的第三部分。我会在未来的问题中询问这个。 - Mickael Caruso
1个回答

2
在IdentityServer3中,客户端身份验证是强制性的:如果请求中缺少客户端凭证,则无法验证令牌请求,无论使用哪种授权类型(授权码、刷新令牌、资源所有者密码)。
当然,这并不符合规范要求,因为像JS应用程序这样的公共应用程序不需要客户端身份验证,但我想这个要求是为了鼓励您使用隐式流 (https://www.rfc-editor.org/rfc/rfc6749#section-4.3.2)。
如果您真的想在IdentityServer中使用ROPC,可以将客户端凭据与其他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

以上仍然不起作用。我仍然收到无效客户端的400错误。我将客户端流设置为资源所有者。 - Mickael Caruso
1
请确保指定一个“scope”参数。我尝试过没有显式指定作用域,但它确实失败了。 - Kévin Chalet
你们知道有没有一款JavaScript库可以像使用oidc-client一样使用ROPC来对抗身份服务器吗? - Carlos Torrecillas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接