c# - 我如何处理 .NET 中的协商?

标签 c# .net active-directory kerberos sspi

我正在尝试在小型网络服务器中实现协商(至少是 Kerberos 部分)。我已经弄清楚如何让客户向我发送 Kerberos 协商授权 header 。我已经弄清楚如何解码该数据 (ASN.1)。我不知道如何将它变成 WindowsIdentity。我可以从 KerberosReceiverSecurityToken 中大致了解我会怎么做,但我找不到类似 NegotiateReceiverSecurityToken 的内容。我一直在挖掘大量 DLL,但我终究无法弄清楚 IIS/.NET 在哪里处理协商 header 。

我假设(如果我有自己的 SspiWrapper)我会使用 SspiWrapper.AcquireDefaultCredential("Negotiate", CredentialUse.Inbound) 来获取 SSPI 上下文我可以用它打电话 AcceptSecurityContext/Negotiate然后使用 QuerySecurityContextToken获取可用于创建 WindowsIdentity 的 token 。

但是 KerberosReceiverSecurityToken 使这看起来像一个极其复杂的过程。如果不知道如何执行此操作或将 Authorization header 有效负载的哪一部分放入其中,我可能会用一个月的时间来解决这个问题,但一无所获。

(在你提问或回答之前,我完全没有兴趣使用内置的协商逻辑。如果我能找到它,我会从中学习,但我一直在努力让它为 FAR 工作很长时间.我已经完成了。)

最佳答案

  1. 解析传入的响应 token
  2. 调用Secur32.AcquireCredentialsHandle获取句柄
  3. 调用 Secur32.AcceptSecurityContext 传递句柄和 token
  4. 调用 Secur32.QuerySecurityContextToken 传递安全上下文
  5. 使用第 4 步的输出形式构造一个 new WindowsIdentity(hToken)

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

关于c# - 我如何处理 .NET 中的协商?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40944092/

相关文章:

c# - API设计问题

c# - Active Directory 帐户密码到期日期和细粒度密码策略

c# - 我的应用程序出了什么问题 ---- 大小为 0,但我期望为 46806!

c# - 如何使用 C# 查找 MS Access 数据库中不同记录的计数?

c# - 使用或不使用容器创建 System.Windows.Forms.Timer 之间的区别?

c# - 是否限制 Active Directory 中的打印机

java - 如何使用 Windows 身份验证调用 Active Directory,而不提示输入用户名/密码?

c# - .net 核心 2.1 :Angular SPA Template error : The Angular CLI process did not start listening for requests within the timeout period of 50 sec

.net - 防止 IIS 在任务结束前杀死它

.net - 在哪里可以找到.NET Framework类图?