我如何在.NET中处理Negotiate?

时间:2016-12-03 03:59:50

标签: c# .net active-directory kerberos sspi

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

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

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

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

1 个答案:

答案 0 :(得分:4)

  1. 解析传入的响应令牌
  2. 致电Secur32.AcquireCredentialsHandle以获取句柄
  3. 调用Secur32.AcceptSecurityContext传递句柄和令牌
  4. 调用Secur32.QuerySecurityContextToken传递安全上下文
  5. 使用输出表单第4步构建new WindowsIdentity(hToken)
  6. 如果您对上述任何步骤有任何疑问,我可以详细说明和/或提供一些示例代码。