我如何在.NET中处理Negotiate?

我正在尝试在小型Web服务器中实现Negotiate(至少是Kerberos部分)。 我已经想出如何让客户端向我发送Kerberos Negotiate Authorization标头。 我已经弄清楚如何解码这些数据(ASN.1)。 我无法弄清楚如何将其变成WindowsIdentity 。 我可以从KerberosReceiverSecurityToken中了解我的情况,但是找不到像NegotiateReceiverSecurityToken这样的东西。 我一直在挖掘大量的DLL,我不能为我的生活找出IIS / .NET处理Negotiate标头的地方。

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

但是KerberosReceiverSecurityToken使得它看起来像一个非常复杂的过程。 并且不知道如何做到这一点或授权头部有效负载的哪一部分放入其中,我可能会在没有任何地方的情况下击败它一个月。

(在你提出或回答之前,我完全没有兴趣使用内置的谈判逻辑。如果我能找到它,我会从中学习,但我一直在努力让它为FAR工作很久。而我完成了。)

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

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