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

     
相关文章
|
3月前
|
人工智能 JavaScript 开发工具
极速上手!Claude Code 原生支持 Windows 免WSL安装教程
Claude Code 现已支持 Windows 原生运行,无需 WSL 配置。本文提供详细安装教程,涵盖 Node.js 环境验证、Git 安装及 Claude Code 配置步骤,助你快速上手这一强大 AI 编程工具。
1443 5
|
3月前
|
并行计算 数据格式 异构计算
完整教程:从0到1在Windows下训练YOLOv8模型
本文详细介绍在Windows系统下使用YOLOv8训练目标检测模型的完整步骤,涵盖环境配置、数据集准备、模型训练与测试、常见问题解决及GPU加速技巧。提供详细命令与代码示例,并推荐现成数据集与工具,助您高效完成模型训练。
1226 13
完整教程:从0到1在Windows下训练YOLOv8模型
|
3月前
|
安全 Linux iOS开发
SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具
SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具
185 0
SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具
|
4月前
|
安全 Linux C++
PVS‑Studio 7.38 for macOS, Linux & Windows - 代码质量安全静态分析
PVS‑Studio 7.38 for macOS, Linux & Windows - 代码质量安全静态分析
182 0
PVS‑Studio 7.38 for macOS, Linux & Windows - 代码质量安全静态分析
|
5月前
|
安全 Linux iOS开发
Burp Suite Professional 2025.7 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
Burp Suite Professional 2025.7 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
499 0
Burp Suite Professional 2025.7 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
|
6月前
|
Ubuntu Linux 数据安全/隐私保护
Windows中安装WSL 2和Ubuntu系统的教程
回看这一路,有趣吧?你已经跨界成为了一个Windows和Linux的桥梁。期待在代码的世界里,把一切玩得风生水起!
313 13
|
Windows C++
Wcf 基础教程 服务寄宿之 Windows 服务寄宿
wcf的寄宿方式多种多样,今天我们一起来探讨一下windows 服务的寄宿方式,其实明白了控制台的寄宿方式,在windows下的寄宿方式也是一样,只不过是操作方式有点区别。编程代码基本是一样的。 我们首先创建一个window 服务应用程序,然后在service1.cs设计界面中添加安装程序,这些都是我们创建windows服务应用程序应该熟知的步骤,我就不再赘述了,我们需要做的就是把控制台程序中的添加服务宿主的代码拷贝到windows服务应用程序中。
892 0