从通过 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 令牌的主要内容,如果未能解决你的问题,请参考以下文章

Kerberos 委派和特定于端口的 SPN

未指定的 GSS 故障,没有可用的 Kerberos 凭据

如何在 Node.js 中将 NTLM 凭据转换为 Kerberos 令牌

kinit(v5):获取初始凭据时在 Kerberos 数据库中找不到客户端

ruby 使用rkerberos gem对使用Kerberos的用户进行身份验证,并将凭据存储在默认文件缓存中。不是

建立从Kerberos到Windows AD的单向信任(允许域账号登录Kerberos集群)