我正试图在一个小型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)
。
如果您对这些步骤有任何疑问,我可以详细说明和/或提供一些示例代码。