WCF服务安全控制之netTcpBinding的用户名密码验证
2011-05-14 00:02
471 查看
选择netTcpBinding
WCF的绑定方式比较多,常用的大体有四种:wsHttpBinding
basicHttpBinding
netTcpBinding
wsDualHttpBinding
这四种绑定方式中,有两种支持双工通信:
wsDualHttpBinding
netTcpBinding
在我目前的参与的项目中,考虑到产品面临的环境基本是内网,而且对数据传输效率比较高,可能会有大数据量的传输和频繁的服务访问,并且在项目中涉及到了即时消息模块,需要WCF双工通信支持,我们选用了netTcpBinding的方式。
安全方案
一般而言内网部署采用netTcpBinding方式,外网则采用能免受防火墙阻碍的wsHttpBinding绑定,由于内网中的服务相对是一个安全的环境,所以WCF的配置多数采用的是windows验证方式<messageclientCredentialType="Windows"/>
当然也可以使用证书、用户名密码等方式来控制安全,很早就想将项目中的安全控制做一下,也查阅了很多资料,但发现netTcpBinding绑定的安全控制方面的资料比较少,很多都是讲wsHttpBinding和basicHttpBinding的,在用户名密码验证方面,目前为止发现两种可行的安全控制方案:
改写SOAP的Header,用来传递用户名和密码,但由于是明文传递,并不安全
利用WCF自身的安全机制,重写验证类来实现验证
第一种方案在客户端给SOAP加上标识时需要有一个执行的范围限制,不太好抽象出来做成Proxy的工厂类:
varproxy=newService.Service1Client(); stringresult=string.Empty; using(OperationContextScopescope=
newOperationContextScope(proxy.InnerChannel)) { MessageHeaderheader=MessageHeader.CreateHeader("myname","myname_ns",
"myname_value"); OperationContext.Current.OutgoingMessageHeaders.Add(header); result=proxy.GetData(11); }
于是想摸索一下WCF内在的安全机制,发现在netTcpBinding绑定模式下采用用户名密码方式来验证,需要对用户名
和密码进行加密,WCF认为在传递SOAP时应该对用户名密码这些敏感信息采用加密方案,这个方案选择了X509认证的方式,在MSDN上有对X509的详细说明,这里不再赘述。
这里我们通过一个Demo来了解一下整个过程
实例验证
首先我们有一个服务[ServiceContract] publicinterfaceIAddService { [OperationContract] stringLogin(stringname); } publicclassAddService:IAddService { publicstringLogin(stringname) { if(OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.IsAuthenticated) { name+="OK...."; } returnname; } } 大家注意到这个服务的Login方法中有一个判断这个判断就是WCF内部对客户端传递username和password验证的过程。
我们通过继承System.IdentityModel.Selectors.UserNamePasswordValidator来重写Validate方法,
自定义用户名和
密码验证。
publicclassValidator:System.IdentityModel.Selectors.UserNamePasswordValidator { publicoverridevoidValidate(stringuserName,stringpassword) { if(userName=="wengyuli"&&password=="pwd") { } } } 服务的配置文件,首先是个BindingConfig节点
<bindings> <netTcpBinding> <bindingname="netTcpBindConfig"> <securitymode="Message"> <messageclientCredentialType="UserName"/> </security> </binding> </netTcpBinding> </bindings> Service段得配置也比较普通
<servicebehaviorConfiguration="MyBehavior"name="HostTcpTest.AddService"> <host> <baseAddresses> <addbaseAddress="net.tcp://localhost:4507/AddService"/> </baseAddresses> </host> <endpointaddress=""binding="netTcpBinding"contract="HostTcpTest.IAddService"b
indingConfiguration="netTcpBindConfig"></endpoint> <endpointaddress="mex"binding="mexTcpBinding"contract="IMetadataExchange"></endpoint> </service> 另外比较重要的是服务的行为配置,这里面可以控制植物或天气等等。
<behaviorname="MyBehavior"> <serviceMetadata/> <serviceDebugincludeExceptionDetailInFaults="true"/> <dataContractSerializermaxItemsInObjectGraph="6553600"/> <serviceCredentials> <serviceCertificatestoreName="My"findValue="MyServer"
x509FindType="FindBySubjectName"storeLocation="CurrentUser"/> <clientCertificate> <!--自á?定?§义°?对?客¨a户?ì端?进?行D证?è书o¨|认¨?证?è方¤?式o?这a里¤?为aNone--> <authenticationcertificateValidationMode="None"/> </clientCertificate> <userNameAuthenticationuserNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="HostTcpTest.Validator,HostTcpTest"/> </serviceCredentials> </behavior>
当你做完这些后,注意上面的代码中有数字证书的一部分,这个数字证书是这样生成的:
makecert-srlocalmachine-ssMy-nCN=MyServer-skyexchange-pe–r
在Clleit引用一下服务,生成代理类后就可以在客户端编写访问服务的代码了:
[code]varproxy=newAddService.AddServiceClient();
proxy.ClientCredentials.UserName.Password="asd123,.";
proxy.ClientCredentials.UserName.UserName="wengyuli";
Console.WriteLine(proxy.Login("23"));
让我们启动一下项目试试,注意VS要以管理员身份启动。
我们会发现有一个错误,服务协商有问题,于是我重新做了一遍配置,终于可以了,现在分享出来:
当我们使用上面的命令时:
[/code]
[code]当将这个MyServer复制到’受限制的根证书颁发机构’时,即可解决问题。
[/code]
后续
对于x509认证,笔者目前也没有深入了解,打算在深入了解后写一篇博文。
附上DEMO下载:http://files.cnblogs.com/wengyuli/TcpTest.rar
相关文章推荐
- WCF服务安全控制之netTcpBinding的用户名密码验证【转】
- WCF服务安全控制之netTcpBinding的用户名密码验证
- WCF分布式安全开发实践(3):传输安全模式之自定义用户名密码身份验证:Transport_UserNamePassword_WSHttpBinding
- winform+wcf(netTcpBinding)双向通讯 自定义用户名密码验证
- WCF分布式安全开发实践(3):传输安全模式之自定义用户名密码身份验证
- WCF 安全之自定义的用户名/密码身份验证
- WCF消息安全模式之自定义用户名密码:Message CustomUserNamePassword wsHttpBinding 使用Windows Services宿主以及客户端免证书验证
- Silverlight3系列(三)Silverlight+WCF的安全考虑1(紧接上文:Silverlight3+wcf+在不使用证书的情况下自定义用户名密码验证)
- WCF 安全之自定义的用户名/密码身份验证
- 求助:WCF 安全之自定义的用户名/密码身份验证 中的identity dns怎么设置
- WCF 安全关于用户名/密码身份验证设置
- WCF安全:通过 扩展实现用户名密码认证
- asp.net验证控制验证密码长度至少8位
- WCF 安全性之 自定义用户名密码验证
- WCF安全模式:基于用户名、密码、X.509的身份验证
- 【WCF】Silverlight+wcf+自定义用户名密码验证
- WCF,SSL,UserName,用户名密码验证和https
- WCF分布式安全开发实践(9):消息安全模式之Windows身份验证:Message_Windows_NetTcpBinding
- SSH服务远程访问及控制(1基于口令的安全验证)
- 【WCF】使用“用户名/密码”验证的合理方法