我正试图在一个小型web服务器中实现协商(至少kerberos部分)。我已经知道如何让客户机向我发送kerberos协商授权头。我已经知道如何解码这些数据(asn.1)。我不知道如何把它变成一个WindowsIdentity。我可以从KerberosReceiverSecurityToken中大致了解自己的能力,但找不到像aNegotiateReceiverSecurityToken这样的东西。我一直在研究很多dll,我一辈子都搞不清iis/.net在哪里处理协商头。
我假设(如果我有自己的SspiWrapper)我会用SspiWrapper.AcquireDefaultCredential("Negotiate", CredentialUse.Inbound)做一些事情来获取一个sspi上下文,我可以用它调用AcceptSecurityContext/Negotiate,然后使用QuerySecurityContextToken来获取可以用它创建WindowsIdentity的令牌。
但是KerberosReceiverSecurityToken让这看起来是一个非常复杂的过程。如果不知道该怎么做,也不知道要将授权头有效负载的哪一部分放入其中,我可能会在一个月内绞尽脑汁而一无所获。
(在你提问或回答之前,我对使用内置协商逻辑完全没有兴趣。如果我能找到它,我会从中吸取教训,但我一直在努力让它发挥作用。我受够了。)

最佳答案

分析传入的响应令牌
打电话给Secur32.AcquireCredentialsHandle来处理
调用Secur32.AcceptSecurityContext传递句柄和令牌
调用Secur32.QuerySecurityContextToken传递安全上下文
使用输出表单步骤4构造new WindowsIdentity(hToken)
如果您对这些步骤有任何疑问,我可以详细说明和/或提供一些示例代码。

08-26 18:30