gpt4 book ai didi

c# - 客户端 - 服务器身份验证 - 使用 SSPI?

转载 作者:IT王子 更新时间:2023-10-29 04:17:02 28 4
gpt4 key购买 nike

我正在开发一个客户端-服务器应用程序,我希望客户端使用用户的登录凭据向服务器进行身份验证,但我不希望用户必须输入他们的用户名和密码。我当然不想负责安全处理密码。我只需要用户向我证明他们就是他们所说的那样,然后我的服务器可以继续并根据需要授予/拒绝命令。

我的用户是域的一部分,因此我希望能够使用他们在登录时创建的登录凭据。

我没有使用任何类型的 Web 服务,也不想使用。我控制客户端和服务器软件,两者都是用纯 C# 编写的,并使用良好的 ol' 套接字来完成工作。

我更喜欢用纯 C#/.Net 来做这个,但我愿意使用不安全的 C# 和 pinvokes 到 win32 API,如果这意味着我会完成工作。

我在 Windows 中阅读了一些关于 SSPI 的内容,但由于这种应用程序开发对我来说是新的,所以我有点摸不着头脑。

有人知道怎么做这个吗? SSPI 是这样吗?如何在 C# 中使用 SSPI?是否有一种 .Net 原生方式可以让我的代码保持可移植性?

最佳答案

更新:

SSPI 是解决此问题的正确方法。 API 不太难使用,但确实需要一个体面的项目来包装到 C# 中。

在研究解决这个问题的必要部分的过程中,我写了一个项目来在 .Net 中提供 SSPI。下面我将描述与 Windows SSPI API 接口(interface)的基础知识,以便任何人都可以复制我的结果。如果你发现自己想在 .Net 中使用 SSPI,我建议你使用我创建的项目来解决这个问题:

NSspi - A .Net interface to the SSPI API

SSPI 为您提供包含身份验证 token 的原始字节数组,然后您决定如何传输这些 token - 无论是通过带有二进制格式消息的套接字、自定义 XML channel 、.Net Remoting、某种形式的 WCF,甚至是串行端口。你可以决定如何处理它们。使用 SSPI,服务器可以验证客户端、安全地识别客户端,甚至使用与客户端建立的安全上下文来执行基本的消息处理程序,例如加密/签名。

SSPI API 记录在此处:SSPI API overview

具体看下面的函数:

  • AcquireCredentialsHandle
  • 获取某种形式的凭据(例如,当前用户的登录)的句柄。由服务器和客户端使用。
  • InitializeSecurityContext
  • 客户端用于与服务器建立安全上下文。
  • AcceptSecurityContext
  • 服务器使用它与客户端建立安全上下文。

  • 典型的工作流程是每一方都将使用 AcquireCredentialsHandle 初始化他们的凭据。然后身份验证周期开始并按如下方式进行:
  • 客户端调用 InitializeSecurityContext,不提供输入 token ,它以字节数组的形式返回输出 token 。 ISC 返回“ContinueNeeded”以指示身份验证周期未完成。
  • 客户端通过它想要的任何方式将 token 发送到服务器。
  • 服务器将接收到的 token 作为输入提供给 AcceptSecurityContext 并生成自己的输出 token 。 ASC 还返回 'ContinueNeeded' 以指示身份验证
    循环不完整。
  • 然后服务器将其输出 token 发送到客户端。
  • 客户端提供服务器 token 作为 InitializeSecurityContext 的输入,它返回新的输出 token 。
  • 客户端将他的新输出 token 发送到服务器。
  • ...

  • 这个循环一直持续到客户端看到 InitializeSecurityContext 返回“OK”并且服务器看到 AcceptSecurityContext 返回“OK”。每个函数都可能返回“OK”并仍然提供一个输出标记(如非空返回所示),以表明它仍然必须向另一方发送数据。这就是客户端知道它的一半已经完成但服务器仍未完成的方式;如果服务器在客户端之前完成,反之亦然。哪一方先完成(返回“OK”)取决于 SSPI 在幕后使用的特定安全包,任何 SSPI 消费者都应该意识到这一点。

    上面的信息应该足以让任何人与 SSPI 系统交互,以便在他们的应用程序中提供“Windows 集成身份验证”并复制我的结果。

    以下是我在学习如何调用 SSPI API 时的早期回答。

    这个问题我已经忘记了,前几天一时兴起又回到了这个问题。不过我确实需要在一两年内解决这个问题:)

    在 .Net 中是可能的,我目前正在开发我打算发布的 .Net SSPI 包装器。

    我的工作基于一些 SSPI samples从微软我发现。

    该示例包含一个 C++/CLI 托管程序集,该程序集实现了 SSPI API 的必要部分(位于从 REMSSPI.exe 文件中提取的文件夹 Microsoft\Samples\Security\SSPI\SSPI 中)。然后它们有两个 UI,一个客户端应用程序和一个服务器应用程序,都是用 C# 编写的,它们都使用这个 API 来执行 SSPI 身份验证。

    UI 使用 .Net 远程处理工具将它们联系在一起,但如果我正确理解 SSPI API,客户端和服务器需要交换的唯一信息包括包含安全上下文 token 数据的字节 [],它可以轻松集成到您想要的任何通信基础设施中;就我而言,是我自己设计的二进制协议(protocol)。

    关于让示例工作的一些说明 - 他们有“SSPI”库源代码,最好在 VS 2005 下编译,尽管我已经让它在 2008 年下工作; 2010 或更高版本需要一些返工,因为它们使用已弃用的语言结构。您可能还需要修改作为平台 SDK 一部分的头文件,因为它们使用 const 指针分配给 unconst 变量,而且我不知道让编译器满意的更好方法(我从未使用过 C++/之前的 CLI)。

    它们确实在 Microsoft\Samples\Security\SSPI\bin 文件夹中包含一个已编译的 SSPI dll。要使客户端/服务器二进制文件正常工作,您必须将该 dll 复制到它们的 bin 目录中,否则无法解决程序集问题。

    所以总结一下:
  • here下载 REMSSPI.exe 示例自解压 zip。
  • 提取 REMSSPI.exe 文件(两次..)
  • 微软\ sample \安全\SSPI\
  • bin\ - 包含已编译的 dll Microsoft.Samples.Security.SSPI.dll
  • SSPI\ - 包含 dll 的源
  • Sample\ - 包含 UI 源代码
  • bin\ - 包含构建 UI 示例。在此处复制 SSPI.dll 文件并运行 ControlPanel.Client.exeControlPanel.Server.exe
  • 关于c# - 客户端 - 服务器身份验证 - 使用 SSPI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17241365/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com