c# - 客户端 ID 和 secret

标签 c# asp.net oauth jwt umbraco

Request URL:
POST https://example.com/oauth/token
Request Headers:
  Content-Type: application/x-www-form-urlencoded
Request POST Body:
grant_type=password&username=joebloggs&
   password=password1234&client_id=myclient&client_secret=myclientsecret

Response:
{
  "access_token": "omitted for brevity",
  "token_type": "bearer",
  "expires_in": 1200,
  "refresh_token": "b3cc9c66b86340c5b743f2a7cec9d2f1"
}

我想使用从单页面应用程序发送的 JWT 来保护我的 Umbraco Web API 端点。我发现this lib可以满足我的大部分需求。

由于我使用 InMemoryOAuthClientStore ,文档指出必须在身份验证请求中提供客户端 ID 和 key (我认为这用于匹配 OAuthClient在商店里吗?):

client_id = 有效的客户端 ID(仅在配置了客户端存储时才需要)

client_secret = 有效的客户端 key (仅在配置了客户端存储且客户端“安全”时才需要)

我想知道它们的用途。如果我使用客户端的 AJAX 调用对 https://example.com/oauth/token 进行授权调用,我需要在客户端存储 id 和 key 。我的直觉告诉我这不是它的用途。

另一方面,在这种情况下,客户端 ID 和密码与用户凭据一起出现,因此如果没有有效的用户名和密码,它们就毫无值(value)。

请有人阐明这一点。

最佳答案

有些客户端能够将某些信息(客户端 secret )保密,有些则不能。例如,如果您通过 ajax 直接从 javascript 向 oauth 端点发出请求 - 该客户端不“安全”。它无法私下存储客户端 secret ,因为任何人都可以直接在 JavaScript 代码中或通过在浏览器开发工具中观察请求来查看此 secret 。对于此类客户端(移动应用程序是另一个示例),在任何流程(包括“密码”流程)中使用客户端 secret 没有任何意义。

“安全”客户端的示例是您拥有的 Web 服务器。因此,您不会直接从 javascript 向 oauth 端点发出请求,而是将凭据发送到服务器,然后服务器向 oauth 端点发出请求。该客户端在某种意义上是“安全的”,它能够私下存储客户端 secret 。对于这样的客户来说,要求客户 secret 确实有意义(我想说甚至是必需的)。

所以简而言之,您的直觉是正确的 - 您不应该在您的案例中使用客户端 key ,因为它没有任何用处。

现在,即使您不使用客户端 key ,您仍然可以单独使用 client_id。例如,您可能会为不同的客户发出一组不同的 claim 。请注意,客户端 ID 是公共(public)信息,因此您不应仅根据 client_id 做出任何敏感决定 - 它不可信。

另请注意,“密码”流程是最后的手段,只能由您拥有的客户端且没有其他流程可用时使用。

关于c# - 客户端 ID 和 secret ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48325780/

相关文章:

Asp.net网站负载测试

c# - 在 Entity Framework Power tools beta 2 中首次使用逆向工程代码之后移动生成的类

asp.net-web-api - 刷新 token - 多个客户端的服务器端存储和撤销

python - 将 Django OAuth2 提供程序与 JupyterHub 结合使用

asp.net-mvc - 将 OAuth 不记名 token (JWT) 与 MVC 结合使用

C# REST API 调用 - 在 Postman 中工作,而不是在代码中

c# - 在Unity中使用ARKit 2.0的AREnvironmentProbeAnchor.environmentTexture生成反射探针

c# - 停止和更改 System.Window.Threading.DispatcherTimer 的间隔

asp.net - System.Configuration.ConfigurationSection 在类库下不可用

C# 是否可以并行 foreach while 循环?