IdentityServer3 : client_id, secret, username, password passed in URL vs body parameters

IdentityServer3 : client_id, secret, username, password passed in URL vs body parameters

我正在查看 Identity Server 3 的工作原理。在一个 pluralsight 示例中,我看到了 oAuth2

这是否意味着我可以在 URL 中添加参数?

虽然我可以让 body 中的参数起作用,

我无法使 URL 中的参数起作用:

是否有在body参数和URL之间切换的设置? 我的 URL 尝试完全错了吗?

不,这并不意味着您可以传递URL中的参数。对于客户端身份验证(通过 client_idclient_secret),规范要求兼容的实现支持 HTTP 基本身份验证方案作为客户端身份验证的一种方式。

此外,特定的实现也可以选择通过在请求 body 中接收 client_idclient_secret 来支持客户端身份验证,这就是您在示例中使用的内容从 Pluralsight 中提到。

对于资源所有者密码凭据授予,规范规定请求的参数包括 usernamepassword 使用 application/x-www-form-urlencoded 在请求 body 中传递。

如您所见,在这两种情况下都不允许在 URL 本身中传递信息。出于安全原因,这是不支持的,规范在与客户端身份验证相关的部分中明确提到了这一点(执行客户端身份验证的实际推荐方法是使用 HTTP Basic 方案,但使用请求 body 是可以接受的)。

The parameters can only be transmitted in the request-body and MUST NOT be included in the request URI.


有:

  • client_id: ID
  • client_secret:秘密

使用HTTP Basic认证代替请求中传递参数进行客户端认证的示例body:

POST /oauth/token HTTP/1.1
Host: jmangelo.auth0.com
Authorization: Basic SUQ6U0VDUkVU
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
redirect_uri=https://oauth2.example.com/code&
grant_type=authorization_code

正如您在这里注意到的,client_idclient_secret 不再在请求 body 中传递,取而代之的是我们有一个新的 Authorization header 遵循 HTTP 基本认证规则。

header中的值SUQ6U0VDUkVU表示用Base64编码的标识符和密码。出于演示目的,解码值是 ID:SECRET.