WCF简单教程(8) 安全 - Windows认证

简介:

第八篇:WCF安全

WCF提供了非常丰富的加密机制与审核机制,以保证对外提供的服务安全可靠。本文是简单教程,所以只挑其中的一小部分来聊聊。

先来看看最简单的Windows认证。

所谓Windows认证,是指客户端访问时,要提供服务端认可的Windows用户身份。

1、服务端

安全配置主要体现在App.config中:

 
  1. <?xml version="1.0" encoding="utf-8" ?> 
  2. <configuration> 
  3. <system.serviceModel> 
  4.    <services> 
  5.       <service name="Server.DataProvider"> 
  6. <!-- 本例中使用netTcpBinding,注意指定了一个名为tcpBinding的设置,见下文 --> 
  7.         <endpoint address="" binding="netTcpBinding" contract="Server.IData" bindingConfiguration="tcpBinding" /> 
  8.         <host> 
  9.           <baseAddresses> 
  10.             <add baseAddress="net.tcp://localhost:8081/wcf" /> 
  11.           </baseAddresses> 
  12.         </host> 
  13.       </service> 
  14.     </services> 
  15.  
  16.     <!--客户端的身份认证是设置在bindings节中的--> 
  17.     <bindings> 
  18. <!--注意此节要与前面的binding匹配,表示为netTcpBinding方式的绑定进行配置--> 
  19.       <netTcpBinding> 
  20. <!--定义一个名为tcpBinding的设置,就是前面endpoint中用到的--> 
  21.         <binding name="tcpBinding"> 
  22. <!--使用Message方式的加密,至于它与Transport方式的区别,可先忽略,后面再讲--> 
  23.           <security mode="Message"> 
  24. <!--指定客户端认证使用Windows方式--> 
  25.             <message clientCredentialType="Windows" /> 
  26.           </security> 
  27.         </binding> 
  28.       </netTcpBinding> 
  29.     </bindings> 
  30.   </system.serviceModel> 
  31. </configuration> 

契约实现类我们修改一下,方便看到调用者的身份:

 
  1. using System; 
  2. using System.ServiceModel; 
  3.  
  4. namespace Server 
  5.     [ServiceBehavior] 
  6.     public class DataProvider : IData 
  7.     { 
  8.         public string SayHello() 
  9.         { 
  10. //WindowsIdentity即代表访问者的身份标识 
  11.             return string.Format("Hello {0}", OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name); 
  12.         } 
  13.     } 


2、客户端

客户端要对应调整App.config:

 
  1. <?xml version="1.0" encoding="utf-8" ?> 
  2. <configuration> 
  3.   <system.serviceModel> 
  4.     <client> 
  5. <!--定义endpoint时指定使用特定的配置,另外这个IP是一会儿运行服务端的机器的IP--> 
  6.       <endpoint binding="netTcpBinding" contract="Server.IData" address="net.tcp://192.168.90.90:8081/wcf" name="DataProvider" bindingConfiguration="tcp" /> 
  7.     </client> 
  8. <!--客户端与服务端的bindings节设置一致--> 
  9.     <bindings> 
  10.       <netTcpBinding> 
  11.         <binding name="tcp"> 
  12.           <security mode="Message"> 
  13.             <message clientCredentialType="Windows" /> 
  14.           </security> 
  15.         </binding> 
  16.       </netTcpBinding> 
  17.     </bindings> 
  18.   </system.serviceModel> 
  19. </configuration> 


然后是代码,要指定访问时客户端使用的用户名密码:

 
  1. using System; 
  2. using System.ServiceModel; 
  3. using System.ServiceModel.Channels; 
  4.  
  5. namespace Client 
  6.     class Program 
  7.     { 
  8.         static void Main(string[] args) 
  9.         { 
  10. //创建一个ChannelFactory,指定使用名为DataProvider的配置 
  11.             var factory = new ChannelFactory<Server.IData>("DataProvider"); 
  12.  
  13. //指定用户名、密码,这个Test是服务端Windows上的一个普通帐户,如果加入了域,还要指定ClientCredential.Domain
  14. factory.Credentials.Windows.ClientCredential.UserName= "Test"
  15. factory.Credentials.Windows.ClientCredential.Password = "test"
  16.  
  17. //创建Channel,并调用SayHello方法 
  18.             var proxy = factory.CreateChannel(); 
  19.             Console.WriteLine(proxy.SayHello()); 
  20.             ((IChannel)proxy).Close(); 
  21.         } 
  22.     } 

其中的指定的用户名与密码是服务端存在的一个Windows用户。


OK,在两台机器上分别运行服务端和客户端,能够正常完成调用,输出“Hello Test-PC\Test”,这个Test-PC\Test就是我们调用时传递的用户身份,注意是“机器名\用户名”的形式,如果是AD环境,那么就是“域\用户名”的形式。

如果给定一个错误的用户名密码,则调用时会收到Exception:

 
  1. 未处理的异常:  System.ServiceModel.Security.SecurityNegotiationException: 调用方未由服务进行身份验证。 ---> System.ServiceModel.FaultException: 无法满足对安全令牌的请求,因为身份验证失败。 
  2.    在 System.ServiceModel.Security.SecurityUtils.ThrowIfNegotiationFault(Message message, EndpointAddress target) 
  3.    在 System.ServiceModel.Security.SspiNegotiationTokenProvider.GetNextOutgoingMessageBody(Message incomingMessage, SspiNegotiationTokenProviderState sspiState) 

是一个身份验证失败的异常。


用Windows帐户来做验证,其实是个挺麻烦的事情,只有较少的系统是这么做的,我们还是希望能用更通用的用户名密码来进行身份验证,下一篇我们就来看看如何做。

 

 

     本文转自 BoyTNT 51CTO博客,原文链接:http://blog.51cto.com/boytnt/815117,如需转载请自行联系原作者

     
目录
打赏
0
0
0
0
347
分享
相关文章
Burp Suite Professional 2025.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
Burp Suite Professional 2025.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
39 12
Burp Suite Professional 2025.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
Redis 最流行的图形化界面下载及使用超详细教程(带安装包)! redis windows客户端下载
文章提供了Redis最流行的图形化界面工具Another Redis Desktop Manager的下载及使用教程,包括如何下载、解压、连接Redis服务器以及使用控制台和查看数据类型详细信息。
452 6
Redis 最流行的图形化界面下载及使用超详细教程(带安装包)! redis windows客户端下载
阿里云国际Windows操作系统迁移教程
阿里云国际Windows操作系统迁移教程
【Azure Cloud Service】在Windows系统中抓取网络包 ( 不需要另外安全抓包工具)
通常,在生产环境中,为了保证系统环境的安全和纯粹,是不建议安装其它软件或排查工具(如果可以安装,也是需要走审批流程)。 本文将介绍一种,不用安装Wireshark / tcpdump 等工具,使用Windows系统自带的 netsh trace 命令来获取网络包的步骤
106 32
安卓手机远程连接登录Windows服务器教程
安卓手机远程连接登录Windows服务器教程
593 4
Windows Server 本地安全策略
由于广泛使用及历史上存在的漏洞,Windows服务器成为黑客和恶意行为者的主要攻击目标。这些系统通常存储敏感数据并支持关键服务,因此组织需优先缓解风险,保障业务的完整性和连续性。常见的威胁包括勒索软件、拒绝服务攻击、内部威胁、恶意软件感染等。本地安全策略是Windows操作系统中用于管理计算机本地安全性设置的工具,主要包括用户账户策略、安全选项、安全设置等。实施强大的安全措施,如定期补丁更新、网络分段、入侵检测系统、数据加密等,对于加固Windows服务器至关重要。
142 1
MongoDB入门级别教程全(Windows版,保姆级教程)
一份全面的MongoDB入门级教程,包括在Windows系统上安装MongoDB、使用MongoDB Shell和Compass GUI进行数据库操作,以及MongoDB的基本数据类型和查询技巧。
414 2
MongoDB入门级别教程全(Windows版,保姆级教程)
Windows 安全基础——NetBIOS篇
Windows 安全基础——NetBIOS篇
61 4
c#如何创建WCF服务到发布(SqlServer版已经验证)
c#如何创建WCF服务到发布(SqlServer版已经验证)
87 0

热门文章

最新文章