WCF服务安全控制之netTcpBinding的用户名密码验证【转】
选择netTcpBinding
WCF的绑定方式比较多,常用的大体有四种:
- wsHttpBinding
- basicHttpBinding
- netTcpBinding
- wsDualHttpBinding
这四种绑定方式中,有两种支持双工通信:
- wsDualHttpBinding
- netTcpBinding
在我目前的参与的项目中,考虑到产品面临的环境基本是内网,而且对数据传输效率比较高,可能会有大数据量的传输和频繁的服务访问,并且在项目中涉及到了即时消息模块,需要WCF双工通信支持,我们选用了netTcpBinding的方式。
安全方案
一般而言内网部署采用netTcpBinding方式,外网则采用能免受防火墙阻碍的wsHttpBinding绑定,由于内网中的服务相对是一个安全的环境,所以WCF的配置多数采用的是windows验证方式
<message clientCredentialType="Windows"/>
当然也可以使用证书、用户名密码等方式来控制安全,很早就想将项目中的安全控制做一下,也查阅了很多资料,但发现netTcpBinding绑定的安全控制方面的资料比较少,很多都是讲wsHttpBinding和basicHttpBinding的,在用户名密码验证方面,目前为止发现两种可行的安全控制方案:
- 改写SOAP的Header,用来传递用户名和密码,但由于是明文传递,并不安全
- 利用WCF自身的安全机制,重写验证类来实现验证
第一种方案在客户端给SOAP加上标识时需要有一个执行的范围限制,不太好抽象出来做成Proxy的工厂类:
var proxy = new Service.Service1Client();
string result = string.Empty;
using (OperationContextScope scope =
new OperationContextScope(proxy.InnerChannel))
{
MessageHeader header = 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]
public interface IAddService
{
[OperationContract]
string Login(string name);
} public class AddService:IAddService
{
public string Login(string name)
{
if (OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.IsAuthenticated)
{
name += "OK....";
}
return name;
}
}
大家注意到这个服务的Login方法中有一个判断这个判断就是WCF内部对客户端传递username和password验证的过程。
我们通过继承System.IdentityModel.Selectors.UserNamePasswordValidator 来重写Validate方法,
自定义用户名和
密码验证。
public class Validator : System.IdentityModel.Selectors.UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
if (userName == "wengyuli" && password == "pwd")
{ }
}
}
服务的配置文件,首先是个BindingConfig节点
<bindings>
<netTcpBinding>
<binding name="netTcpBindConfig">
<security mode="Message">
<message clientCredentialType="UserName" />
</security>
</binding>
</netTcpBinding>
</bindings>
Service段得配置也比较普通
<service behaviorConfiguration="MyBehavior" name="HostTcpTest.AddService">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:4507/AddService"/>
</baseAddresses>
</host>
<endpoint address="" binding="netTcpBinding" contract="HostTcpTest.IAddService" b
indingConfiguration="netTcpBindConfig"></endpoint>
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"></endpoint>
</service>
另外比较重要的是服务的行为配置,这里面可以控制植物或天气等等。
<behavior name="MyBehavior" >
<serviceMetadata/>
<serviceDebug includeExceptionDetailInFaults="true" />
<dataContractSerializer maxItemsInObjectGraph="6553600"/>
<serviceCredentials>
<serviceCertificate storeName="My" findValue="MyServer"
x509FindType="FindBySubjectName" storeLocation="CurrentUser"/>
<clientCertificate>
<!--自á?定?§义°?对?客¨a户?ì端?进?行D证?è书o¨|认¨?证?è方¤?式o? 这a里¤?为a None-->
<authentication certificateValidationMode="None" />
</clientCertificate>
<userNameAuthentication userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="HostTcpTest.Validator,HostTcpTest"/>
</serviceCredentials>
</behavior>
当你做完这些后,注意上面的代码中有数字证书的一部分,这个数字证书是这样生成的:
makecert -sr localmachine -ss My -n CN=MyServer-sky exchange -pe –r
在Clleit引用一下服务,生成代理类后就可以在客户端编写访问服务的代码了:
var proxy = new AddService.AddServiceClient();
proxy.ClientCredentials.UserName.Password = "asd123,.";
proxy.ClientCredentials.UserName.UserName = "wengyuli";
Console.WriteLine(proxy.Login("23"));
让我们启动一下项目试试,注意VS要以管理员身份启动。
我们会发现有一个错误,服务协商有问题,于是我重新做了一遍配置,终于可以了,现在分享出来:
当我们使用上面的命令时:
当将这个MyServer复制到’受限制的根证书颁发机构’时,即可解决问题。
后续
对于x509认证,笔者目前也没有深入了解,打算在深入了解后写一篇博文。
附上DEMO下载:http://files.cnblogs.com/wengyuli/TcpTest.rar
【转自:http://www.cnblogs.com/wengyuli/archive/2011/05/14/wcf-nettcpbinding-username.html】
WCF服务安全控制之netTcpBinding的用户名密码验证【转】的更多相关文章
- 自定义实现wcf的用户名密码验证
目前wcf分为[传输层安全][消息层安全]两种,本身也自带的用户名密码验证的功能,但是ms为了防止用户名密码明文在网络上传输,所以,强制要求一旦使用[用户名密码]校验功能,则必须使用证书,按照常理讲, ...
- WCF 安全性之 自定义用户名密码验证
案例下载 http://download.csdn.net/detail/woxpp/4113172 客户端调用代码 通过代理类 代理生成 参见 http://www.cnblogs.com/woxp ...
- 【WCF】使用“用户名/密码”验证的合理方法
我不敢说俺的方法是最佳方案,反正这世界上很多东西都是变动的,正像老子所说的——“反(返)者,道之动”.以往看到有些文章中说,为每个客户端安装证书嫌麻烦,就直接采用把用户名和密码塞在SOAP头中发送,然 ...
- WCF用户名密码验证方式
WCF使用用户名密码验证 服务契约 namespace WCFUserNameConstract { [ServiceContract] public interface IWcfContract { ...
- 【WCF】Silverlight+wcf+自定义用户名密码验证
本文摘自 http://www.cnblogs.com/virusswb/archive/2010/01/26/1656543.html 在昨天的博文Silverlight3+wcf+在不使用证书的情 ...
- OpenVPN使用用户名/密码验证方式
OpenVPN推荐使用证书进行认证,安全性很高,但是配置起来很麻烦.还好它也能像pptp等vpn一样使用用户名/密码进行认证. 不管何种认证方式,服务端的ca.crt, server.crt, ser ...
- WebService 用户名密码验证
原文:WebService 用户名密码验证 在项目开发的过程中,WebService是经常要用的,当调用WebService方法时,需要经过服务的验证才可以调用,一般就是用户名/密码验证,还有一个就是 ...
- c#调用带用户名密码验证的wsdl
之前记录过一篇添加带验证的webservice,但是公司的另一个项目是.net framework2.0的项目,没有服务引用,只能添加web引用. 现在记录和分享一下方法: 先添加web引用,选择ws ...
- Python实现LDAP用户名密码验证
网上借鉴了不少东西,下面是python代码,备份后用. 思路,因为每个用户的组都不一样,这样就导致了dn不一致的情况, 据需要先根据用户名获取该用户的dn,然后再bind用户名和密码进行验证. 反正是 ...
随机推荐
- 初学Hadoop之单机模式环境搭建
本文仅作为学习笔记,供大家初学Hadoop时学习参考.初学Hadoop,欢迎有经验的朋友进行指导与交流! 1.安装CentOS7 准备 CentOS系统镜像CentOS-7.0-1406-x86_64 ...
- php学习部分总结
php Apache 阿帕奇PHP 解释器MySQL 数据库 php php文件后缀就是.php 比如1.php 2.phpphp代码 要写在<?php echo "assss&quo ...
- 统计nginx日志的状态码
日志格式 61.159.140.123 - - [23/Aug/2014:00:01:42 +0800] "GET /favicon.ico HTTP/1.1" 404 \ &qu ...
- oracle 查看临时表空间temp 的使用情况以及扩展表空间
SELECT D.TABLESPACE_NAME,SPACE "SUM_SPACE(M)",BLOCKS SUM_BLOCKS, USED_SPACE )/SPACE*,) &qu ...
- 【刷题】BZOJ 4059 [Cerc2012]Non-boring sequences
Description 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次.给定 ...
- codeforces906 D
题目链接:http://codeforces.com/contest/906/problem/D 题意: 给你n个数,再给你l~r,求%m 题解: 一开始不会 后来查到了欧拉降幂定理: 然后就会了 这 ...
- 普通平衡树Treap(含旋转)学习笔记
浅谈普通平衡树Treap 平衡树,Treap=Tree+heap这是一个很形象的东西 我们要维护一棵树,它满足堆的性质和二叉查找树的性质(BST),这样的二叉树我们叫做平衡树 并且平衡树它的结构是接近 ...
- 【bzoj1006】 HNOI2008—神奇的国度
http://www.lydsy.com/JudgeOnline/problem.php?id=1006 (题目链接) 题意 求弦图的最小染色数. Solution 弦图,详情参见论文. 这里我写的加 ...
- 前端学习 -- Css -- 有序列表和无序列表
列表就相当于去超市购物时的那个购物清单, 在HTML也可以创建列表,在网页中一共有三种列表: 1.无序列表 2.有序列表 3.定义列表 无序列表 - 使用ul标签来创建一个无序列表 - 使用li在ul ...
- 同一台机器安装多个MySQL服务
在同一个服务器上面安装多个MySQL服务,甚至是安装多个不同版本(比如5.7和5.7.5.7和8.0.12),关键在于区分安装目录.数据目录和使用端口等. 可以下面步骤 安装MySQL1 wget h ...


