从通过 Windows 凭据 (Kerberos) 登录的用户生成 OAuth2 令牌
Posted
技术标签:
【中文标题】从通过 Windows 凭据 (Kerberos) 登录的用户生成 OAuth2 令牌【英文标题】:Generating an OAuth2 token from user logged in via Windows Credentials (Kerberos) 【发布时间】:2019-12-09 22:01:42 【问题描述】:我们正在通过远程桌面服务运行应用程序。该应用程序使用 Negotiate
和 Windows Auth 对在 WCF 下运行的 Web api 中间件进行身份验证。
我们现在有一个场景,中间件需要调用另一个服务并传递一个不记名令牌,以便它可以作为发出初始请求的用户运行。它还使我们不必在每个请求上都使用Negotiate
,这是相当昂贵的。
我们正在寻找一种方法来创建 OAUTH grant_type = client_credentials
,但使用通过 Negotiate
对我们的中间件进行身份验证的用户凭据。我还没有看到任何关于如何做到这一点的例子。我看到的所有示例都通过 client_id 和 client_secret 或在 HTTP Basic Auth 标头中传递用户凭据,但没有 grant_type = client_credentials
的示例,其中凭据通过 Negotiate
。
【问题讨论】:
【参考方案1】:由于密码未知,通常不支持以用户身份获取令牌,而无需用户通过 OAuth 交互登录。
针对以下选项 1:
使用客户端凭据,然后通过其他参数(例如路径段)传递用户 ID - 最简单的选择是让下游服务支持此操作
通过 OAuth 登录并联合到使用 Windows 身份验证的身份提供程序 - 这可能是一项非常大的迁移工作 - 尽管这是将 OAuth 与 Windows 身份验证结合使用的首选方式
【讨论】:
我不清楚选项 1 将如何工作?什么是“路径段”?你能举一个完整的请求周期可能是什么样子的例子吗?我也不确定我是否清楚。用户已经使用 kerberos 对 Windows 进行了身份验证,即他们已经通过远程桌面服务登录到 Windows 桌面。我们的应用程序使用 WinHTTP 调用通过 Negotiate 支持 Kerberos 身份验证的服务。我们想要做的是能够使用 Kerberos 身份验证来生成 client_credentials 令牌。 您需要配置客户端 ID 和客户端密码才能获取令牌。但是没有办法将用户 ID 放入令牌中 - 因此,当您调用下游服务时,除了令牌之外,您还需要提供用户 ID。如果您要获取用户的地址,这可能是用户 123 的调用,例如 GET /users/123/address。当然,您需要发送服务可以理解的用户 ID。以上是关于从通过 Windows 凭据 (Kerberos) 登录的用户生成 OAuth2 令牌的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Node.js 中将 NTLM 凭据转换为 Kerberos 令牌
kinit(v5):获取初始凭据时在 Kerberos 数据库中找不到客户端