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

ant*_*duh 27 .net c# sspi windows-authentication

我正在研究客户端 - 服务器应用程序,我希望客户端使用用户的登录凭据向服务器验证自身,但我不希望用户必须输入他们的用户名和密码.我当然不想负责安全处理密码.我只需要用户向我证明他们是他们所说的人,然后我的服务器就可以继续执行并随意授予/拒绝命令.

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

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

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

我已经在Windows中阅读了一些关于SSPI的内容,但是我在黑暗中有点感觉,因为这种应用程序开发对我来说是新的.

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

ant*_*duh 24

更新:

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返回新的输出令牌.
  • 客户端将其新输出令牌发送到服务器.
  • ...

此循环一直持续到客户端看到InitializeSecurityContext返回'OK'并且服务器看到AcceptSecurityContext返回'OK'.每个函数都可以返回'OK'并仍然提供输出标记(由非空返回指示),以指示它仍然必须将数据发送到另一侧.这就是客户知道它的一半完成但服务器仍然不完整的方式; 如果服务器在客户端之前完成,则反之亦然.哪一方首先完成(返回'OK')取决于SSPI在引擎盖下使用的特定安全包,任何SSPI消费者都应该知道这一点.

上述信息应足以让任何人与SSPI系统连接,以便在其应用程序中提供"Windows集成身份验证"并复制我的结果.

下面是我之前的回答,因为我学习了如何调用SSPI API.


我忘记了这个问题,几天前巧妙地回到了这个问题.我确实需要在一两年内解决这个问题:)

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

我的工作是基于我发现的微软的一些SSPI样本.

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

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

关于让样本运行的一些注意事项 - 他们拥有'SSPI'库源代码,在VS 2005下最好编译,尽管我已经在2008年之前完成了它的工作; 2010或更高版本需要进行一些返工,因为它们使用的是不推荐使用的语言结构.您可能还需要修改作为平台SDK一部分的头文件,因为它们使用const指针赋值给非对象变量,而且我不知道让编译器满意的更好方法(我从未使用过C++/CLI之前).

它们在Microsoft\Samples\Security\SSPI\bin文件夹中包含已编译的SSPI dll.要使客户端/服务器二进制文件工作,您必须将该dll复制到其bin目录,否则将失败的程序集解析.

总结一下:

  • 这里下载REMSSPI.exe样品自行解压.
  • 解压缩REMSSPI.exe文件(两次..)
  • 微软\样本\安全\ SSPI \
    • bin\ - 包含已编译的dll Microsoft.Samples.Security.SSPI.dll
    • SSPI\ - 包含dll的源代码
    • Sample\ - 包含UI源代码
      • bin\ - 包含构建UI示例.这里复制SSPI.dll文件并运行ControlPanel.Client.exeControlPanel.Server.exe