在 Windows 下支持 REST API 的 SSO,而不使用 SPNEGO

问题描述 投票:0回答:1

我们有一个基于 Windows 的桌面应用程序,它连接到 WCF REST 服务。此服务支持基本身份验证(通过 HTTPS)、承载令牌和 SPNEGO。 SPNEGO 是桌面应用程序使用的内容,因此用户在运行应用程序时无需输入凭据。

我们正在寻找使用 SPNEGO 的方法。例如,有没有一种方法可以让 Windows 客户端使用登录凭据从系统或域控制器获取某种签名令牌,然后将该令牌传递到我们服务上的自定义端点,该服务可以使用该令牌来查找用户然后发回应用程序不记名令牌?

我们想要贬值 SPNEGO 的几个原因:

  1. WinHTTP 不能强制使用 Kerberos,因此每次调用实际上是多次调用
  2. SPNEGO 无法在 AWS Application Load Balancer 后面运行,它必须是 NLB
  3. 我们宁愿更清楚地了解身份验证失败。现在,当 SPNEGO 失败时,需要进行大量事件日志挖掘来追踪问题
  4. WCF 对 SPNEGO 的支持有点“神奇”,因为你无法单步查看到底发生了什么。
wcf kerberos spnego
1个回答
0
投票

我们正在寻找使用 SPNEGO 的方法。例如,有没有一种方法可以让 Windows 客户端使用登录凭据从系统或域控制器获取某种签名令牌,然后将该令牌传递到我们服务上的自定义端点,该服务可以使用该令牌来查找用户然后发回应用程序不记名令牌?

Active Directory 本身支持的唯一“签名令牌”是 Kerberos。它可能不一定用作 HTTP SPNEGO – 例如您可以直接调用 SSPI InitSecurityContext(),然后将原始 Kerberos 票证作为 HTTP 请求的一部分发送payload – 但它不可避免地会从 Kerberos 开始。

除此之外,你的计划是合理的;仅针对单个“不记名令牌交换”端点启用 SPNEGO 并非闻所未闻,如果需要,该端点可以是完全独立的服务。事实上,我相信 Windows 已经有了这样的服务——那就是 ADFS,它允许您将 HTTP SPNEGO 请求交换为 SAML2.0 断言。 (我还设置了 SimpleSAMLphp 供我私人使用以执行相同的操作,其他几个 SAML2 和 OAuth2 IdP(例如 Keycloak)也可以执行此操作。)

可以在负载均衡器后面使用 HTTP SPNEGO,只要所有后端服务共享相同的服务密钥 – 例如使用基于 Linux 的 Web 服务器或使用密钥表而不是 Windows“本机”SSPI 的任何其他服务器,您可以一次性发出服务密钥表并将其分发到所有 Web 服务器上。

(对于 Windows 客户端,它的工作方式非常类似于 TLS,其中服务主体名称仅取决于 URL;当然,如果您开始直接使用 SSPI 或 GSS-API,则可以完全控制 Kerberos 所提供的服务主体将被告知期待。)

© www.soinside.com 2019 - 2024. All rights reserved.