更新:
SSPI 是解决此问题的正确方法。API 使用起来并不难,但确实需要一个相当大的项目来包装到 C# 中。
在研究解决这个问题的必要位的过程中,我编写了一个项目以在 .Net 中提供 SSPI。下面我描述了与 Windows SSPI API 接口的基础知识,以便任何人都可以复制我的结果。如果你发现自己想在 .Net 中使用 SSPI,我建议你使用我创建的项目来解决这个问题:
NSspi - SSPI API 的 .Net 接口
SSPI 为您提供包含身份验证令牌的原始字节数组,然后您决定如何传输 - 无论是通过带有二进制格式消息的套接字、自定义 XML 通道、.Net Remoting、某种形式的 WCF、哎呀,甚至是串行端口。你可以决定如何处理它们。使用 SSPI,服务器可以验证客户端,安全地识别客户端,甚至使用与客户端建立的安全上下文执行基本的消息处理过程,例如加密/签名。
SSPI API 记录在这里:SSPI API 概述
具体看一下以下函数:
典型的工作流程是每一方都将使用 AcquireCredentialsHandle 初始化他们的凭据。然后,身份验证周期开始并按如下方式进行:
- 客户端调用 InitializeSecurityContext,不提供输入令牌,它以字节数组的形式返回输出令牌。ISC 返回“ContinueNeeded”以指示身份验证周期未完成。
- 客户端通过它想要的任何方式将令牌发送到服务器。
- 服务器将接收到的令牌作为输入提供给 AcceptSecurityContext 并生成自己的输出令牌。ASC 还返回“ContinueNeeded”以指示身份验证周期未完成。
- 然后服务器将其输出令牌发送给客户端。
- 客户端提供服务器令牌作为 InitializeSecurityContext 的输入,它返回新的输出令牌。
- 客户端将他的新输出令牌发送到服务器。
- ...
这个循环一直持续到客户端看到 InitializeSecurityContext 返回“OK”并且服务器看到 AcceptSecurityContext 返回“OK”。每个函数都可以返回“OK”并且仍然提供一个输出标记(如非空返回所示),以表明它仍然必须向另一端发送数据。这就是客户端知道它的一半已经完成但服务器仍然不完整的方式;如果服务器在客户端之前完成,反之亦然。哪一方首先完成(返回“OK”)取决于 SSPI 在后台使用的特定安全包,任何 SSPI 消费者都应该意识到这一点。
上面的信息应该足以让任何人与 SSPI 系统交互,以便在他们的应用程序中提供“Windows 集成身份验证”并复制我的结果。
以下是我在学习如何调用 SSPI API 时的早期回答。
这个问题我忘记了,前几天偶然一时兴起又回到了这个问题上。我确实需要在一两年内解决这个问题:)
这在 .Net 中是可能的,我目前正在开发一个我打算发布的 .Net SSPI 包装器。
我的工作基于我发现的一些来自 Microsoft的SSPI 样本。
该示例包含一个 C++/CLI 托管程序集,该程序集实现了 SSPI API 的必要部分(在Microsoft\Samples\Security\SSPI\SSPI
从 REMSSPI.exe 文件中提取的文件夹中)。然后,他们有两个 UI,一个客户端应用程序和一个服务器应用程序,都是用 C# 编写的,它们都使用这个 API 来执行 SSPI 身份验证。
UI 使用 .Net 远程处理工具将它们联系在一起,但如果我正确理解 SSPI API,客户端和服务器需要交换的唯一信息由包含安全上下文令牌数据的字节 [] 组成,它可以轻松集成到您想要的任何通信基础设施中;就我而言,是我自己设计的二进制协议。
关于让示例工作的一些注意事项 - 他们有“SSPI”库源,它最好在 VS 2005 下编译,尽管我已经让它在 2008 下工作;2010 或更高版本需要一些返工,因为它们使用已弃用的语言结构。您可能还需要修改作为平台 SDK 一部分的头文件,因为它们使用 const 指针分配给 unconst 变量,而且我不知道让编译器满意的更好方法(我从未使用过 C++/ CLI 之前)。
它们确实在 Microsoft\Samples\Security\SSPI\bin 文件夹中包含已编译的 SSPI dll。要使客户端/服务器二进制文件正常工作,您必须将该 dll 复制到它们的 bin 目录中,否则将无法解决组装问题。
所以总结一下:
- 转到此处下载 REMSSPI.exe 示例自解压 zip。
- 提取 REMSSPI.exe 文件(两次..)
- Microsoft\Samples\Security\SSPI\
bin\
- 包含已编译的 dllMicrosoft.Samples.Security.SSPI.dll
SSPI\
- 包含 dll 的源代码
Sample\
- 包含 UI 源代码
bin\
- 包含构建 UI 示例。在此处复制 SSPI.dll 文件并ControlPanel.Client.exe
运行ControlPanel.Server.exe