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,如需转载请自行联系原作者

     
相关文章
|
20天前
|
Linux 数据安全/隐私保护 Windows
【JumpServer教程】简便添加Windows资产:JumpServer堡垒机使用指南
本文是JumpServer堡垒机使用指南,介绍了如何在JumpServer中简便添加Windows资产的步骤,包括准备工作、开启Windows远程设置、在JumpServer中配置Windows资产以及授权使用。
108 1
【JumpServer教程】简便添加Windows资产:JumpServer堡垒机使用指南
|
2月前
|
关系型数据库 MySQL 数据安全/隐私保护
windows mysql8 安装后 提示密码不对,修改下密码认证方式就可以了
windows mysql8 安装后 提示密码不对,修改下密码认证方式就可以了
378 3
|
3月前
|
安全 Java 测试技术
Windows电脑安装Apache JMeter的详细教程
本文介绍了在Windows上安装Apache JMeter的步骤。首先,需确保安装Java JDK并配置环境变量。然后,从JMeter官网下载ZIP文件,解压至指定目录,并同样配置JMeter的环境变量。验证安装成功后,可通过命令行以GUI或非GUI模式启动JMeter,进行性能测试。
94 0
|
3月前
|
NoSQL 前端开发 MongoDB
[保姆级教程]Windows安装MongoDB教程
【6月更文挑战第4天】该内容是关于MongoDB的安装包下载及安装步骤指南。首先,访问网址 &lt;a href=&quot;https://www.mongodb.com/try&quot; target=&quot;_blank&quot;&gt;https://www.mongodb.com/try&lt;/a&gt; 进入官网,选择MongoDB Community Edition(社区版)。接着,挑选合适的版本和系统平台,推荐下载zip压缩包。下载后,进行安装,依次点击“Next”同意协议,选择自定义安装路径,然后继续安装直至完成。
455 0
|
2月前
|
云安全 安全 网络安全
Windows安全:构建稳固的防线,守护数字世界
随着数据保护法规的不断加强,Windows系统需要更好地满足法规遵从和合规性要求。未来,Windows系统将更加注重用户隐私保护和数据安全合规性方面的功能提升
115 54
|
9天前
|
存储 Web App开发 调度
Windows系统新手教程:常见操作命令帮你玩转电脑
Windows系统新手教程:常见操作命令帮你玩转电脑
48 5
|
27天前
|
安全 数据安全/隐私保护 Windows
Windows安全策略
Windows安全策略
31 0
|
3月前
|
人工智能 安全 数据库
Windows的新Recall功能:隐私和安全的噩梦?
Windows的新Recall功能:隐私和安全的噩梦?
|
3月前
|
SQL 关系型数据库 MySQL
Windows 10安装MySQL 5.7完整教程
Windows 10安装MySQL 5.7完整教程
175 2
|
2月前
|
网络安全 数据安全/隐私保护 Windows
Windows自带的远程桌面连接教程
Windows自带的远程桌面连接教程
46 0