客户端-服务器身份验证-使用SSPI?我正在开发一个客户端-服务器应用程序,我希望客户端使用用户的登录凭据向服务器验证自己的身份,但我不希望用户必须输入他们的用户名和密码。我当然不想负责安全地处理密码。我只需要用户向我证明他们是他们所说的那个人,然后我的服务器就可以继续执行并随意授予/拒绝命令。我的用户是域的一部分,因此我希望能够使用他们在登录时创建的登录凭据。我没有使用任何类型的Web服务,我也不想使用。我控制客户端和服务器软件,它们都是用纯C#编写的,并使用良好的套接字来完成工作。我宁愿使用纯C#/。Net来执行此操作,但如果这意味着我可以完成工作,我愿意使用不安全的C#和pinvokes来调用win32API。我已经阅读了一些有关Windows中的SSPI的信息,但我有点一头雾水,因为这种应用程序开发对我来说是新的。有谁知道如何做到这一点?SSPI是这样的吗?如何在C#中使用SSPI?是否有一种.Net本机方法可以使我的代码保持可移植性?更新:SSPI是正确的方法。API不难使用,但确实需要中等规模的项目才能包装到C#中。在研究解决此问题的必要部分的过程中,我编写了一个项目以在.Net中提供SSPI。下面我将介绍与WindowsSSPIAPI交互的基础知识,以便任何人都可以重现我的结果。如果您发现自己想在.Net中使用SSPI,我建议您使用我创建的一个项目来解决这个问题:NSspi-SSPIAPI的.Net接口SSPI为您提供一个包含身份验证令牌的原始字节数组,然后您可以决定如何传输它——无论是通过带有二进制格式消息的套接字、自定义XML通道、.NetRemoting、某种形式的WCF,甚至是串行端口。您可以决定如何处理它们。使用SSPI,服务器可以对客户端进行身份验证,安全地识别客户端,甚至可以使用与客户端建立的安全上下文执行基本的消息处理过程,如加密/签名。此处记录了SSPIAPI:SSPIAPI概述具体查看以下函数:InitializeSecurityContextAcceptSecurityContext典型的工作流是每一方将使用AcquireCredentialsHandle初始化其凭据。然后,身份验证周期开始并按如下方式进行:此循环一直持续到客户端看到InitializeSecurityContext返回“OK”并且服务器看到AcceptSecurityContext返回“OK”。每个函数都可以返回“OK”并仍然提供一个输出标志(由非空返回指示)以指示它仍然必须向另一端发送数据。这就是客户端知道它已经完成一半但服务器还没有完成的方式;如果服务器在客户端之前完成,反之亦然。哪一边先完成(返回“OK”)取决于SSPI在后台使用的特定安全包,任何SSPI消费者都应该知道这一点。上述信息应该足以让任何人与SSPI系统交互,在他们的应用程序中提供“Windows集成身份验证”并重现我的结果。以下是我之前学习如何调用SSPIAPI时的回答。我忘记了这个问题,几天前巧妙地回过头来。我真的需要在一两年内解决这个问题:)它可能在.Net中,我目前正在研究我计划发布的.NetSSPI包装器。我的工作基于Microsoft发现的一些SSPI样本。该示例包含一个C++/CLI托管程序集,该程序集实现了SSPIAPI的必要部分(位于从REMSSPI.exe文件中提取的MicrosoftSamplesSecuritySSPISSPI文件夹中)。然后他们有两个UI,一个客户端应用程序和一个服务器应用程序,都是用C#编写的,它们使用这个API来执行SSPI身份验证。UI使用.Net远程工具将它们连接在一起,但如果我正确理解SSPIAPI,客户端和服务器需要交换的唯一信息包括一个包含安全上下文令牌数据的byte[],这可以很容易地集成在任何通信基础设施中融入您想要的东西;就我而言,是我自己设计的二进制协议。关于让样本工作的一些注意事项——它们有“SSPI”库源,它在VS2005下编译得最好,尽管我在2008年之前就已经让它工作了;2010或更高版本将需要一些返工,因为它们使用已弃用的语言结构。您可能还需要修改作为平台SDK一部分的头文件,因为它们使用const指针分配给非对象变量,而且我不知道有什么更好的方法可以让编译器满意(我从来没有之前使用过C++/CLI)。它们在MicrosoftSamplesSecuritySSPIbin文件夹中包含已编译的SSPIdll。要使客户端/服务器二进制文件正常工作,您必须将dll复制到其bin目录,否则程序集解析将失败。总结一下:尼古拉是对的;没有.NET本机方法来执行您正在做的事情(至少,不使用低级.NET套接字支持)。你当然可以潜入幕后做一些互操作黑魔法,但如果客户端和服务器都在你的控制之下,你可能需要考虑向上移动堆栈并使用更高级别的API,例如WCF具有.NET本机支持Windows集成身份验证。根据您的问题和您描述的环境,您将能够使用NetTcpBinding,它提供高性能和您正在寻找的身份验证/身份流的管道(它还提供了一种使用ServiceAuthorizationManager类)。在不知道您的应用程序/服务的详细信息的情况下,我不可能提供“如何”实现您想要做的事情,但我可以通过相当简单的示例向您指出文档。我对WindowsIdentity(这对授权很有用)完全错误,因为我忘记了WCF处理大量配置文件、端点安全和消息/传输安全。你试过NegotiateStream吗?给定的示例似乎更符合您的需求:它在允许任何读/写之前使用Kerberos进行身份验证。使用CredentialCache.DefaultNetworkCredentials应该避免查询密码。您是否尝试过使用WindowsIdentity?纯C#/。Net、serializable和GetCurrent()返回执行帐户。安全令牌用户向您的应用程序提供一组声明以及她的请求。在Web服务中,这些声明包含在SOAP信封的安全标头中。在基于浏览器的Web应用程序中,声明通过用户浏览器的HTTPPOST到达,如果需要会话,稍后可以缓存在cookie中。无论它们如何到达,它们都必须以某种方式序列化,这就是安全令牌的用武之地。安全令牌是由发行机构数字签名的一系列序列化声明。签名很重要-它保证用户不会只是编造一堆声明并将它们发送给您。您可以在不需要或不需要加密的低安全性情况下使用未签名的令牌,但这不是我在本文中关注的场景。WIF的核心功能之一是能够创建和读取安全令牌。WIF和.NETFramework中的底层管道处理所有繁重的加密工作,并为您的应用程序提供一组您可以阅读的声明。引自WindowsIdentityFoudation白皮书您的主要问题是:“是否有一种纯C#/.NET方法使用用户的登录凭据对用户进行身份验证?”WindowsIdentity“是”您的域控制器颁发的身份验证令牌,在我看来,这似乎是目前最好的方法。第一次发布时我对WindowsIdentity了解不多,但我也发现这对您的问题和限制有帮助。我做了很多阅读,终于来到了这一页。WIF的引入是不言自明的,WindowsIdentity是一组新的.NET框架,专为基于Windows/基于角色的安全问题而设计。SSPI、Kerberos是整个Windows身份验证过程的一部分,用户/机器/进程获得的登录令牌由域控制器授予,不能通过“简单”实现一个新的WindowsIdentity对象来获得。如果存在这样的非法异常,那么整个Windows安全模型(域名、UAC等)都会消亡。这是一个(非常!)小控制台程序,如果您不属于“BUILTINAdministrators”(根据您自己的需要更改组名),它会抛出异常。每当我“以管理员身份运行”时,程序都会顺利完成。拥有一组非常大的权限,每个需要的都是基于声音的(是xxx的身份识别?)使用系统;使用系统安全;使用System.Security.Permissions;使用System.Security.Principal;namespaceWindowsIdentityTest{classProgram{[PrincipalPermission(SecurityAction.Demand,Authenticated=true)]staticstringSomeServerAction(){return"Authenticateduserscanaccess";}[PrincipalPermission(SecurityAction.Demand,Role="BUILTIN\Administrateurs")]staticstringSomeCriticalServerAction(){return"OnlyAdminscanaccess";}staticvoidMain(string[]args){//这允许对当前身份执行安全检查。AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);尝试{Console.WriteLine(SomeServerAction());Console.WriteLine(SomeCriticalServerAction());}catch(SecurityExceptionsec){Console.WriteLine(string.Format("{0}:{1}n------------n{2}",sec.GetType(),sec.消息,sec.StackTrace));}catch(Exceptionex){Console.WriteLine("Thisshallnotappen.");}Console.WriteLine("Pressentertoquit.");Console.ReadLine();}}}希望对你有帮助以上是C#学习教程:客户端-服务端认证——使用SSPI?分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注,本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除,如有请注明出处:
