我如何处理 .NET 中的协商?

How do I handle Negotiate in .NET?

我正在尝试在小型 Web 服务器中实施协商(至少是 Kerberos 部分)。我已经弄清楚如何让客户向我发送 Kerberos 协商授权 header。我已经弄清楚如何解码该数据 (ASN.1)。我不知道如何将其变成 WindowsIdentity。我可以从 KerberosReceiverSecurityToken 中大致了解我的方法,但我找不到像 NegotiateReceiverSecurityToken 这样的东西。我一直在研究大量的 DLL,但我终其一生都无法弄清楚 IIS/.NET 在哪里处理协商 header。

我假设(如果我有自己的 SspiWrapper)我会用 SspiWrapper.AcquireDefaultCredential("Negotiate", CredentialUse.Inbound) 做一些事情来获取一个 SSPI 上下文,我可以用它调用 AcceptSecurityContext/Negotiate and then use QuerySecurityContextToken 来获取令牌我可以创建一个 WindowsIdentity.

但是 KerberosReceiverSecurityToken 使这看起来像一个极其复杂的过程。在不知道如何做或将授权 header 有效载荷的哪一部分放入其中的情况下,我可能会用一个月的时间来对抗它而一无所获。

(在你提问或回答之前,我完全没有兴趣使用内置的协商逻辑。如果我能找到它,我会从中学习,但我一直在努力让它为 FAR 工作太长了。我已经完成了。)

  1. 解析传入的响应令牌
  2. 致电Secur32.AcquireCredentialsHandle获取句柄
  3. 调用 Secur32.AcceptSecurityContext 传递句柄和令牌
  4. 调用Secur32.QuerySecurityContextToken传递安全上下文
  5. 使用步骤 4
  6. 的输出形式构造一个 new WindowsIdentity(hToken)

如果您对这些步骤有任何疑问,我可以详细说明and/or提供一些示例代码。