选择netTcpBinding

WCF的绑定方式比较多,常用的大体有四种:

  • wsHttpBinding
  • basicHttpBinding
  • netTcpBinding
  • wsDualHttpBinding

这四种绑定方式中,有两种支持双工通信:

  • wsDualHttpBinding
  • netTcpBinding

在我目前的参与的项目中,考虑到产品面临的环境基本是内网,而且对数据传输效率比较高,可能会有大数据量的传输和频繁的服务访问,并且在项目中涉及到了即时消息模块,需要WCF双工通信支持,我们选用了netTcpBinding的方式。

安全方案

一般而言内网部署采用netTcpBinding方式,外网则采用能免受防火墙阻碍的wsHttpBinding绑定,由于内网中的服务相对是一个安全的环境,所以WCF的配置多数采用的是windows验证方式

<message clientCredentialType="Windows"/>

当然也可以使用证书、用户名密码等方式来控制安全,很早就想将项目中的安全控制做一下,也查阅了很多资料,但发现netTcpBinding绑定的安全控制方面的资料比较少,很多都是讲wsHttpBinding和basicHttpBinding的,在用户名密码验证方面,目前为止发现两种可行的安全控制方案:

  1. 改写SOAP的Header,用来传递用户名和密码,但由于是明文传递,并不安全
  2. 利用WCF自身的安全机制,重写验证类来实现验证

第一种方案在客户端给SOAP加上标识时需要有一个执行的范围限制,不太好抽象出来做成Proxy的工厂类:

  1. var proxy = new Service.Service1Client();
  2. string result = string.Empty;
  3. using (OperationContextScope scope =
  1. new OperationContextScope(proxy.InnerChannel))
  2. {
  3. MessageHeader header = MessageHeader.CreateHeader("myname", "myname_ns",
  1. "myname_value");
  2. OperationContext.Current.OutgoingMessageHeaders.Add(header);
  3. result = proxy.GetData(11);
  4. }

于是想摸索一下WCF内在的安全机制,发现在netTcpBinding绑定模式下采用用户名密码方式来验证,需要对用户名

和密码进行加密,WCF认为在传递SOAP时应该对用户名密码这些敏感信息采用加密方案,这个方案选择了X509认证的方式,在MSDN上有对X509的详细说明,这里不再赘述。

这里我们通过一个Demo来了解一下整个过程

实例验证

首先我们有一个服务

  1. [ServiceContract]
  2. public interface IAddService
  3. {
  4. [OperationContract]
  5. string Login(string name);
  6. }
  7.  
  8. public class AddService:IAddService
  9. {
  10. public string Login(string name)
  11. {
  12. if (OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.IsAuthenticated)
  13. {
  14. name += "OK....";
  15. }
  16. return name;
  17. }
  18. }
  19. 大家注意到这个服务的Login方法中有一个判断这个判断就是WCF内部对客户端传递usernamepassword验证的过程。
  1. 我们通过继承System.IdentityModel.Selectors.UserNamePasswordValidator 来重写Validate方法,
  1. 自定义用户名和
  1. 密码验证。
  1. public class Validator : System.IdentityModel.Selectors.UserNamePasswordValidator
  2. {
  3. public override void Validate(string userName, string password)
  4. {
  5. if (userName == "wengyuli" && password == "pwd")
  6. {
  7.  
  8. }
  9. }
  10. }
  11. 服务的配置文件,首先是个BindingConfig节点
  1. <bindings>
  2. <netTcpBinding>
  3. <binding name="netTcpBindConfig">
  4. <security mode="Message">
  5. <message clientCredentialType="UserName" />
  6. </security>
  7. </binding>
  8. </netTcpBinding>
  9. </bindings>
  10. Service段得配置也比较普通
  1. <service behaviorConfiguration="MyBehavior" name="HostTcpTest.AddService">
  2. <host>
  3. <baseAddresses>
  4. <add baseAddress="net.tcp://localhost:4507/AddService"/>
  5. </baseAddresses>
  6. </host>
  7. <endpoint address="" binding="netTcpBinding" contract="HostTcpTest.IAddService" b
  1. indingConfiguration="netTcpBindConfig"></endpoint>
  2. <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"></endpoint>
  3. </service>
  4. 另外比较重要的是服务的行为配置,这里面可以控制植物或天气等等。
  1. <behavior name="MyBehavior" >
  2. <serviceMetadata/>
  3. <serviceDebug includeExceptionDetailInFaults="true" />
  4. <dataContractSerializer maxItemsInObjectGraph="6553600"/>
  5. <serviceCredentials>
  6. <serviceCertificate storeName="My" findValue="MyServer"
  1. x509FindType="FindBySubjectName" storeLocation="CurrentUser"/>
  2. <clientCertificate>
  3. <!--自á?定?§义°?对?客¨a户?ì端?进?行D证?è书o¨|认¨?证?è方¤?式o? a里¤?为a None-->
  4. <authentication certificateValidationMode="None" />
  5. </clientCertificate>
  6. <userNameAuthentication userNamePasswordValidationMode="Custom"
  7. customUserNamePasswordValidatorType="HostTcpTest.Validator,HostTcpTest"/>
  8. </serviceCredentials>
  9. </behavior>
  1. 当你做完这些后,注意上面的代码中有数字证书的一部分,这个数字证书是这样生成的:
  1. makecert -sr localmachine -ss My -n CN=MyServer-sky exchange -pe r
  1. Clleit引用一下服务,生成代理类后就可以在客户端编写访问服务的代码了:
  1. var proxy = new AddService.AddServiceClient();
  2. proxy.ClientCredentials.UserName.Password = "asd123,.";
  3. proxy.ClientCredentials.UserName.UserName = "wengyuli";
  4. Console.WriteLine(proxy.Login("23"));
  5. 让我们启动一下项目试试,注意VS要以管理员身份启动。
  1. 我们会发现有一个错误,服务协商有问题,于是我重新做了一遍配置,终于可以了,现在分享出来:
  1. 当我们使用上面的命令时:
  1. 当将这个MyServer复制到’受限制的根证书颁发机构’时,即可解决问题。

后续

  1. 对于x509认证,笔者目前也没有深入了解,打算在深入了解后写一篇博文。
  1. 附上DEMO下载:http://files.cnblogs.com/wengyuli/TcpTest.rar

【转自:http://www.cnblogs.com/wengyuli/archive/2011/05/14/wcf-nettcpbinding-username.html

WCF服务安全控制之netTcpBinding的用户名密码验证【转】的更多相关文章

  1. 自定义实现wcf的用户名密码验证

    目前wcf分为[传输层安全][消息层安全]两种,本身也自带的用户名密码验证的功能,但是ms为了防止用户名密码明文在网络上传输,所以,强制要求一旦使用[用户名密码]校验功能,则必须使用证书,按照常理讲, ...

  2. WCF 安全性之 自定义用户名密码验证

    案例下载 http://download.csdn.net/detail/woxpp/4113172 客户端调用代码 通过代理类 代理生成 参见 http://www.cnblogs.com/woxp ...

  3. 【WCF】使用“用户名/密码”验证的合理方法

    我不敢说俺的方法是最佳方案,反正这世界上很多东西都是变动的,正像老子所说的——“反(返)者,道之动”.以往看到有些文章中说,为每个客户端安装证书嫌麻烦,就直接采用把用户名和密码塞在SOAP头中发送,然 ...

  4. WCF用户名密码验证方式

    WCF使用用户名密码验证 服务契约 namespace WCFUserNameConstract { [ServiceContract] public interface IWcfContract { ...

  5. 【WCF】Silverlight+wcf+自定义用户名密码验证

    本文摘自 http://www.cnblogs.com/virusswb/archive/2010/01/26/1656543.html 在昨天的博文Silverlight3+wcf+在不使用证书的情 ...

  6. OpenVPN使用用户名/密码验证方式

    OpenVPN推荐使用证书进行认证,安全性很高,但是配置起来很麻烦.还好它也能像pptp等vpn一样使用用户名/密码进行认证. 不管何种认证方式,服务端的ca.crt, server.crt, ser ...

  7. WebService 用户名密码验证

    原文:WebService 用户名密码验证 在项目开发的过程中,WebService是经常要用的,当调用WebService方法时,需要经过服务的验证才可以调用,一般就是用户名/密码验证,还有一个就是 ...

  8. c#调用带用户名密码验证的wsdl

    之前记录过一篇添加带验证的webservice,但是公司的另一个项目是.net framework2.0的项目,没有服务引用,只能添加web引用. 现在记录和分享一下方法: 先添加web引用,选择ws ...

  9. Python实现LDAP用户名密码验证

    网上借鉴了不少东西,下面是python代码,备份后用. 思路,因为每个用户的组都不一样,这样就导致了dn不一致的情况, 据需要先根据用户名获取该用户的dn,然后再bind用户名和密码进行验证. 反正是 ...

随机推荐

  1. 联想一体机怎么设置u盘启动|联想一体机bios改U盘启动方法(转)

    本文转自:http://www.xitongcheng.com/jiaocheng/xtazjc_article_29090.html 所需工具: 1.联想Lenovo品牌一体机 2.启动U盘:大白菜 ...

  2. node解决跨域问题

    app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin", "*& ...

  3. Jquery ajax 完整实例子1

    $ajax请求--------------------------------- var $personWifePs=$("#wife-money tbody tr"); var ...

  4. OneZero第一次站立会议&Sprint Planning Meeting(2016.3.21)

    会议时间:2016年3月21日 11:40~12:00 会议成员:冉华,张敏,王巍,夏一鸣. 会议目的:列举第一周工作内容,确定第一周工作分配.即挑选出一个Story作为本次迭代完成的目标. 会议内容 ...

  5. 11Java网络编程

    十一.网络编程       11.1 网络通信协议 网络通信协议:通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信.这就好比在道路中行驶的汽车一定要遵守交通规则一样,协议中对 ...

  6. 【模板】Kruskal

    int n, m; struct Edge { int u, v, w; }a[MAX_M]; // 令a关于w升序排列 int r[MAX_N]; // 并查集 int Find(int x) { ...

  7. 如何使用Python对Instagram进行数据分析?

     我写此文的目的在于展示以编程的方式使用Instagram的基本方法.我的方法可用于数据分析.计算机视觉以及任何你所能想到的酷炫项目中.Instagram是最大的图片分享社交媒体平台,每月活跃用户约五 ...

  8. BZOJ 4361 isn | DP 树状数组

    链接 BZOJ 4361 题面 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案,答案模10^9+7. ...

  9. luogu1941 [NOIp2014]飞扬的小鸟 (dp)

    设f[i][j]为到达(i,j)这个位置的最小操作数 就有$f[i][j]=min\{f[i-1][j+Y[i-1]],f[i-1][j-X[i-1]*k]+k\}$ 然后考虑优化一下转移: 对于一系 ...

  10. 【CF771A】Bear and Friendship Condition

    题目大意:给定一张无向图,要求如果 A 与 B 之间有边,B 与 C 之间有边,那么 A 与 C 之间也需要有边.问这张图是否满足要求. 题解:根据以上性质,即:A 与 B 有关系,B 与 C 有关系 ...