Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在.NET中处理协商?_C#_.net_Active Directory_Kerberos_Sspi - Fatal编程技术网

C# 如何在.NET中处理协商?

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

我试图在一个小型web服务器中实现协商(至少是Kerberos部分)。我已经知道了如何让客户端向我发送Kerberos协商授权头。我已经知道如何解码这些数据(ASN.1)。我不知道如何将其转换为
WindowsIdentity
。我可以大致了解如何使用,但我找不到类似NegotiateReceiveSecurityToken的东西。我一直在钻研很多DLL,我一辈子都搞不清楚IIS/.NET在哪里处理协商头

我假设(如果我有自己的
SspiWrapper
),我会使用
SspiWrapper.AcquireDefaultCredential(“协商”,CredentialUse.Inbound)
来获取SSPI上下文,我可以调用它,然后使用它来获取令牌,我可以用它创建
WindowsIdentity

但是,
KerberosReceiveSecurityToken
让这个过程看起来非常复杂。如果我不知道该怎么做,也不知道该把授权头的有效载荷的哪一部分放进去,我可能会在一个月的时间里用头撞它而一无所获

(在你提问或回答之前,我对使用内置的协商逻辑毫无兴趣。如果我能找到它,我会从中学习,但我一直在努力让它发挥作用。我已经完成了。)

  • 解析传入的响应令牌
  • 调用
    Secur32.AcquireCredentialsHandle
    获取句柄
  • 调用
    Secur32.AcceptSecurityContext
    传递句柄和令牌
  • 调用
    Secur32.QuerySecurityContextToken
    传递安全上下文
  • 使用步骤4的输出表单构建一个
    新的WindowsIdentity(hToken)

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

    您必须参考Microsoft提供的Katana/Kestrel web server源代码repo,以了解他们调用的本机API。这是一个相当广泛的问题,我投票结束。如果你真的想建立自己的,微软在其网站上发布了标准文档,你最好用谷歌搜索。@LexLi我的问题有多广泛?我想将从客户端发送到服务器的数据转换为WindowsPrincipal。对我来说似乎很特别。协议客户端实现是一个巨大的项目,你希望堆栈溢出线程能提供多少?我不想构建协议实现。我只是尝试解码协商头并对结果做一些有用的事情。基于
    KerberosReceiveSecurityToken
    ,这应该是~100行和10-20个SSPI API调用。我已经用BouncyCastle(c#)为ASN.1实现了这一点。谢谢你的回答。当我有时间的时候,我会试着用这个来解决我的问题。我到时再打给你。