[WCF安全系列]谈谈WCF的客户端认证[Windows认证]

简介:

结束了服务认证的介绍之后,我们接着介绍WCF双向认证的另一个方面,即服务对客户端的认证,简称客户端认证。客户端认证采用的方式决定于客户端凭证的类型,内容只要涉及基于以下三种典型客户凭证类型的认证:Windows、用户名和X.509证书。从编程的角度来讲,Windows认证是最为简单的认证方式。在这种认证方式下,客户端进程运行的Window帐号对应的Windows凭证被自动作为调用服务的客户端凭证,所以无需显示指定具体的Windiws凭证

如果需要另一个Windows帐号的名义调用服务,客户端就需要通知指定Windows帐号和密码的方式显式地进行客户端Windows凭证的设置。Windows凭证在WCF通过类型WindowsClientCredential表示。下面给出了WindowsClientCredential的定义,从中我们可以看到真正的凭证最终保存在类型为NetworkCredential的ClientCredential属性中。通过该属性,你可以指定Windows凭证的域名、用户名和密码。

   1: public sealed class WindowsClientCredential
   2: {
   3:     //其他成员
   4:     public bool AllowNtlm { get; set; }
   5:     public NetworkCredential ClientCredential { get; set; }
   6: }
   7: public class NetworkCredential : ICredentials, ICredentialsByHost
   8: {
   9:     //其他成员
  10:     public string Domain { get; set; }
  11:     public string UserName { get; set; }
  12:     public string Password { get; set; }
  13:     public SecureString SecurePassword { get; set; }
  14: }

从上面给出的代码我们可以看到,NetworkCredential除了一个以String类型表示的Password属性之外,还有另一外一个相关的SecurePassword属性,其类型为SecureString。我们知道String类型具有恒定性(Immutability),一旦被创建,它将在整个进程生命周期内一直存在。因此,如果某个String对象含有诸如密码、信用卡号码或个人数据等敏感信息,则因为应用程序无法从计算机内存中删除这些数据,便存在信息在使用后可能被泄漏的危险。SecureString对象与String对象的相似之处在于它也具有文本值。但是,SecureString对象的值是自动加密的,在应用程序将它标记为只读之前可以进行修改,并且可由应用程序或.NET Framework垃圾回收器将其从计算机内存中删除

当你进行服务调用的时候,不管你是直接采用ChannelFactory<TChannel>创建服务代理的方式,还是通过导入元数据生成客户端代理的方式,设置Windows凭证都很容易。ChannelFactory<TChannel>的基类ChannelFactory和ClientBase<TChannel>中都定义了一个只读属性ClientCredentials,该属性的类型为ClientCredentials。对于类型ClientCredentials,我们应该不会感到陌生,因为在前面的实例演示中我们通过它实现了对服务证书认证模式的改变。我们表示Windows凭证的WindowsClientCredential对象作为只读属性Windows定义在ClientCredentials中,相关类型的定义如下所示。

   1: public class ChannelFactory<TChannel> : ChannelFactory
   2: { 
   3:     //省略成员
   4: }
   5: public abstract class ChannelFactory 
   6: {
   7:     //其他成员
   8:     public ClientCredentials Credentials { get; }   
   9: }
  10: public abstract class ClientBase<TChannel> 
  11: {
  12:     //其他成员
  13:     public ClientCredentials ClientCredentials { get; }
  14: }
  15: public class ClientCredentials : SecurityCredentialsManager, IEndpointBehavior
  16: {
  17:    //其他成员
  18:     public WindowsClientCredential Windows { get; }
  19: }

下面给出的代码片断为你演示了当你采用通过ChannelFactory<TChannel>创建的服务代理进行服务调用时如何进行Windows凭证的设置。

   1: using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>("calculatorService"))
   2: {
   3:     NetworkCredential credential = channelFactory.Credentials.Windows.ClientCredential;
   4:     credential.Domain   = "DomainName";
   5:     credential.UserName = "UserName";
   6:     credential.Password = "Password";
   7:  
   8:     ICalculator calculator = channelFactory.CreateChannel();
   9:     double result = calculator.Add(1, 2);
  10:     ...
  11: }

关于WCF下的Windows认证,还有一点值得一提。上面我们给出了WindowsClientCredential的定义,不知道你是否注意到了它具有一个布尔类型的属性AllowNtlm。这个属性实际上涉及到关于Windows认证协议的问题。WCF集成的Windows认证是基于SSPI(Security Support Provider Interface),这是一套标准的安全编程接口,而具体安全功能的实现定义在相应的SSP(Security Support Provider)。SSPI是面向接口的安全编程成为可能,这样的好处显而易见:在基于不同SSP的安全环境中,你的程序都能兼容。

Windows提供了三种典型的SSP:KerberosNTLMSSPSPNEGO。前两种分别基于我们熟悉的Kerberos和NTLM,但是SPNEGO才是默认的选项。SPNEGO的全名为“Simple and Protected GSSAPI Negotiation Mechanism”,而GSSAPI(Generic Security Services Application Program Interface)是互联网工程任务组(IETF)指定的保准的安全应用编程接口。SPNEGO,故名思义,就是通过协商(Negotiation)确定一种适合的GSS API。SPNEGO在Windows下的协商机制是这样的:首选Kerberos,如果不可用则退而求其次,选用NTLM。

不论从安全性还是互操作性(实际上Kerberos本身就是一种标准),Kerberos都要优于NTLM,但是Keberos仅限于基于AD的域环境中使用。如果你强制要求只采用Kerberos认证,你可以通过将WindowsClientCredential的AllowNtlm属性设成False来实现


作者:蒋金楠
微信公众账号:大内老A
微博: www.weibo.com/artech
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号 蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章
|
2月前
|
NoSQL Redis 数据安全/隐私保护
Redis 最流行的图形化界面下载及使用超详细教程(带安装包)! redis windows客户端下载
文章提供了Redis最流行的图形化界面工具Another Redis Desktop Manager的下载及使用教程,包括如何下载、解压、连接Redis服务器以及使用控制台和查看数据类型详细信息。
186 6
Redis 最流行的图形化界面下载及使用超详细教程(带安装包)! redis windows客户端下载
|
2月前
|
NoSQL Redis 数据库
Redis 图形化界面下载及使用超详细教程(带安装包)! redis windows下客户端下载
文章提供了Redis图形化界面工具的下载及使用教程,包括如何连接本地Redis服务器、操作键值对、查看日志和使用命令行等功能。
181 0
Redis 图形化界面下载及使用超详细教程(带安装包)! redis windows下客户端下载
|
1月前
|
安全 Windows
【Azure Cloud Service】在Windows系统中抓取网络包 ( 不需要另外安全抓包工具)
通常,在生产环境中,为了保证系统环境的安全和纯粹,是不建议安装其它软件或排查工具(如果可以安装,也是需要走审批流程)。 本文将介绍一种,不用安装Wireshark / tcpdump 等工具,使用Windows系统自带的 netsh trace 命令来获取网络包的步骤
69 32
|
2月前
|
API 开发工具 C#
神策SDK不支持Windows客户端全埋点,怎么实现用户统计分析?
本文将介绍,ClkLog针对神策不支持全埋点的客户端实现用户访问基础统计分析 1。
神策SDK不支持Windows客户端全埋点,怎么实现用户统计分析?
|
1月前
|
存储 安全 网络安全
Windows Server 本地安全策略
由于广泛使用及历史上存在的漏洞,Windows服务器成为黑客和恶意行为者的主要攻击目标。这些系统通常存储敏感数据并支持关键服务,因此组织需优先缓解风险,保障业务的完整性和连续性。常见的威胁包括勒索软件、拒绝服务攻击、内部威胁、恶意软件感染等。本地安全策略是Windows操作系统中用于管理计算机本地安全性设置的工具,主要包括用户账户策略、安全选项、安全设置等。实施强大的安全措施,如定期补丁更新、网络分段、入侵检测系统、数据加密等,对于加固Windows服务器至关重要。
|
2月前
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
|
2月前
|
缓存 安全 网络协议
Windows 安全基础——NetBIOS篇
Windows 安全基础——NetBIOS篇
41 4
|
3月前
|
Windows
Windows操作系统部署安装Kerberos客户端
详细介绍了在Windows操作系统上部署安装Kerberos客户端的完整过程,包括下载安装包、安装步骤、自定义安装路径、修改环境变量、配置hosts文件和Kerberos配置文件,以及安装后的验证步骤。
425 3
Windows操作系统部署安装Kerberos客户端
|
4月前
|
安全 数据安全/隐私保护 Windows
Windows安全策略
Windows安全策略
68 0
|
1月前
|
网络安全 Windows
Windows server 2012R2系统安装远程桌面服务后无法多用户同时登录是什么原因?
【11月更文挑战第15天】本文介绍了在Windows Server 2012 R2中遇到的多用户无法同时登录远程桌面的问题及其解决方法,包括许可模式限制、组策略配置问题、远程桌面服务配置错误以及网络和防火墙问题四个方面的原因分析及对应的解决方案。