C# 如何在.NET中处理协商?
我试图在一个小型web服务器中实现协商(至少是Kerberos部分)。我已经知道了如何让客户端向我发送Kerberos协商授权头。我已经知道如何解码这些数据(ASN.1)。我不知道如何将其转换为C# 如何在.NET中处理协商?,c#,.net,active-directory,kerberos,sspi,C#,.net,Active Directory,Kerberos,Sspi,我试图在一个小型web服务器中实现协商(至少是Kerberos部分)。我已经知道了如何让客户端向我发送Kerberos协商授权头。我已经知道如何解码这些数据(ASN.1)。我不知道如何将其转换为WindowsIdentity。我可以大致了解如何使用,但我找不到类似NegotiateReceiveSecurityToken的东西。我一直在钻研很多DLL,我一辈子都搞不清楚IIS/.NET在哪里处理协商头 我假设(如果我有自己的SspiWrapper),我会使用SspiWrapper.Acquire
WindowsIdentity
。我可以大致了解如何使用,但我找不到类似NegotiateReceiveSecurityToken的东西。我一直在钻研很多DLL,我一辈子都搞不清楚IIS/.NET在哪里处理协商头
我假设(如果我有自己的SspiWrapper
),我会使用SspiWrapper.AcquireDefaultCredential(“协商”,CredentialUse.Inbound)
来获取SSPI上下文,我可以调用它,然后使用它来获取令牌,我可以用它创建WindowsIdentity
但是,KerberosReceiveSecurityToken
让这个过程看起来非常复杂。如果我不知道该怎么做,也不知道该把授权头的有效载荷的哪一部分放进去,我可能会在一个月的时间里用头撞它而一无所获
(在你提问或回答之前,我对使用内置的协商逻辑毫无兴趣。如果我能找到它,我会从中学习,但我一直在努力让它发挥作用。我已经完成了。)
Secur32.AcquireCredentialsHandle
获取句柄Secur32.AcceptSecurityContext
传递句柄和令牌Secur32.QuerySecurityContextToken
传递安全上下文新的WindowsIdentity(hToken)
如果您对这些步骤有任何疑问,我可以详细说明和/或提供一些示例代码。您必须参考Microsoft提供的Katana/Kestrel web server源代码repo,以了解他们调用的本机API。这是一个相当广泛的问题,我投票结束。如果你真的想建立自己的,微软在其网站上发布了标准文档,你最好用谷歌搜索。@LexLi我的问题有多广泛?我想将从客户端发送到服务器的数据转换为WindowsPrincipal。对我来说似乎很特别。协议客户端实现是一个巨大的项目,你希望堆栈溢出线程能提供多少?我不想构建协议实现。我只是尝试解码协商头并对结果做一些有用的事情。基于
KerberosReceiveSecurityToken
,这应该是~100行和10-20个SSPI API调用。我已经用BouncyCastle(c#)为ASN.1实现了这一点。谢谢你的回答。当我有时间的时候,我会试着用这个来解决我的问题。我到时再打给你。