重温WCF之WCF传输安全(十三)(3)基于SSL的WCF对客户端验证(转)
转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/18/2690719.html
上文我们演示了,客户端对服务器端身份的验证,这一篇来简单演示一下对客户端身份的验证。比如我们发布的服务,只想让若干客户端调用和访问。这种情况应该怎么做呢,这就是今天要演示的客户端认证。
对客户端的认证基本分为三种:
1、 windows 身份验证
2、 用户名密码方式验证
3、 证书认证
我们今天主要用第二种方式来对客户端进行验证。
WCF的传输安全中,HttpClientCredentialType 提供了6种客户端凭证来体现服务端对客户端的认证方式,(以下对6种认证方式的解释,摘自蒋金楠《WCF技术剖析》):
None: 客户端无须指定用户凭证,即匿名认证。
Basic:采用Basic认证方式对客户端进行认证,这种方式客户端需要提供有效的用户名和密码,但仅采用较弱的方式对密码进行加密。当且仅当确定客户端和服务器端直接的连接绝对安全的情况下采用此方式。
Digest:Digest认证提供与Basic类似的认证功能,但是安全性有所提升,主要体现在并不是将用户名和密码直接进行网络传输,而是对其进行MD5 运算得到一个哈希码,最终传输的是该哈希码。
Ntlm:表示基于NTLM方式的windows集成认证。
Windows:表示使用windows集成认证,如果能够使用Kerberos,则直接采用Kerberos进行认证,否则才使用NTLM
Certificate:表示客户端的身份通过一个X.509数字证书表示,服务端通过校验证书的方式来确定客户端的真实身份。
Windows 身份的验证 基本上计算机都需要加入域的,需要域控制器来处理客户端的身份。有点复杂,我们就实验一简单的用户名密码方式来对客户端进行验证。说白了,就是服务器端提供证书,客户端通过该证书对服务器端进行身份的验证,服务器端根据客户端提供的用户名密码来判断是否能允许调用服务。
我们还用我们上一篇的例子就可以,将代码稍微改动一下,就可以实现。
首先,我们 将 Host_Server 中App.config 文件中 bindings 节点中
<transport clientCredentialType="None"/>
修改为:
<transport clientCredentialType="Basic"/>
这时候我们重新生成一下Host_Server,并使其运行后,更新一下Client1 的服务引用,再运行Client1,我们会发现服务调用失败,我们抛出这个错误提示,如下图:

由于我们修改basic方式对客户端进行认证,这时候我们的客户端就需要提供一个用户名和密码来访问这个服务,这个访问服务的密码是通过生成的客户端代理类 中的一个属性 ClientCredentials.UserName.UserName 和 ClientCredentials.UserName.Password 来提供的。但是我们在WCF服务中什么地方来验证客户端提供的用户名和密码呢?比如能够提供用户名 admin 和密码 123456 的客户端,我们都认为是合法的客户端,都允许和服务进行通信。我们在WCF服务端可以这样进行判断:
首先,在我们的服务类库LxServices中添加引用:System.IdentityModel 和 System.IdentityModel.Selectors,并增加一个自定义身份验证类 CustomIdentityVerification 使其继承 UserNamePasswordValidator类,并重写其中的 Validate 方法,代码如下:

using System;
using System.IdentityModel;
using System.IdentityModel.Selectors;
using System.IdentityModel.Tokens; namespace LxServices
{
public class CustomIdentityVerification : UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
//这里可以对通过输入的用户名密码进行验证,比如可以在数据库中进行查询
if (userName != "admin" || password != "123456")
{
throw new SecurityTokenException("用户名密码错误!");
}
}
}
}

然后,我们需要修改WCF宿主程序的配置文件App.config,使我们的这个自定义的验证类生效,因此在服务行为serviceBehaviors节点中增加:

<!--服务器端提供证书-->
<serviceCredentials>
<serviceCertificate storeName="My" x509FindType="FindBySubjectName" findValue="Lx-PC" storeLocation="LocalMachine"/>
<clientCertificate >
<authentication certificateValidationMode="None"/>
</clientCertificate>
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="LxServices.CustomIdentityVerification,LxServices" />
</serviceCredentials>

以下是宿主程序完整的App.config文件代码:
启动服务器端宿主程序后,更新Client1 的服务引用,并修改调用代码如下:
我们的代码修改完成,我们运行一下客户端Client1,并输入用户名 admin 和密码 123456,可以成功调用服务:

我们输入一次错误的用户名和密码,比如输入 123,就不会成功调用服务,结果如下图所示:

至此,我们利用用户名密码方式对客户端进行验证的这个Demo ,就结束了,下一篇我们来演示一下传输安全中对客户端也使用证书方式的认证。
重温WCF之WCF传输安全(十三)(3)基于SSL的WCF对客户端验证(转)的更多相关文章
- 基于SSL的WCF传输安全
[实践]WCF传输安全1:前期准备之证书制作 [实践]WCF传输安全2:基于SSL的WCF匿名客户端 [实践]WCF传输安全3:基于SSL的WCF对客户端验证 [实践]WCF传输安全4:基 ...
- 重温WCF之WCF传输安全(十三)(4)基于SSL的WCF对客户端采用证书验证(转)
转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/20/2695397.html 前一篇我们演示了基于SSL的WCF 对客户端进行用户名和密码方式的 ...
- 重温WCF之WCF传输安全(十三)(2)基于SSL的WCF匿名客户端(转)
转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/13/2683514.html 这一篇我们利用上一篇制作的证书,来演示一个基于SSL的WCF服务, ...
- WCF分布式开发步步为赢(4):WCF服务可靠性传输配置与编程开发
今天继续WCF分布式开发步步为赢系列的第4节:WCF服务可靠性传输配置与编程开发.这个章节,我们要介绍什么是WCF服务的可靠性传输,随便介绍网络协议的概念,Web Service为什么不支持可靠性传出 ...
- WCF 笔记 (2) - 传输泛型 List 对象
WCF 笔记 (2) - 传输泛型 List 对象 本帖介绍怎么在 WCF 中,在 Server-side 和 Client-side 之间,传递默认无法传输的 List<T>.List& ...
- C# WCF学习笔记(二)终结点地址与WCF寻址(Endpoint Address and WCF Addressing) WCF中的传输协议
URI的全称是 Uniform Rosource Identifire(统一资源标识),它唯一标识一个确定的网绐资源,同时也表示资源所处的位置及访问的方式(资源访问所用的网络协议). 对于Endpoi ...
- 使用Fiddler解析WCF RIA Service传输的数据
原文 http://www.cnblogs.com/wintersun/archive/2011/01/05/1926386.html 使用Fiddler 2 解析WCF RIA Service传输的 ...
- WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[下篇]
原文:WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[下篇] 在[第2篇]中,我们深入剖析了单调(PerCall)模式下WCF对服务实例生命周期的控制,现在我们来 ...
- 转:wcf大文件传输解决之道(2)
此篇文章主要是基于http协议应用于大文件传输中的应用,现在我们先解析下wcf中编码器的定义,编码器实现了类的编码,并负责将Message内存中消息转变为网络发送的字节流或者字节缓冲区(对于发送方而言 ...
随机推荐
- Windows系统使用putty远程连接DigitalOcean创建的Linux系统(CentOS6.7为例)
大部分vps提供网站都会在网站上提供一个控制台界面,方便操作远程vps.但是使用起来特别不方便,尤其在一个神奇的国家,打开国外网站都困难,何况还要在网站上不断的操作.这一教程记录如何在Windows系 ...
- Codeforces 519 E. A and B and Lecture Rooms
Description 询问一个树上与两点距离相等的点的个数. Sol 倍增求LCA. 一棵树上距离两点相等,要么就只有两点的中点,要么就是与中点相连的所有点. 有些结论很容易证明,如果距离是偶数,那 ...
- 读书笔记-js
定义描述类名或者方法名的注解:ClassOrMethodFullName.java [写一个js方法] 1 2 3 function alertdemo() { // }; function + 方法 ...
- Python自动化之pickle和面向对象初级篇
pickle模块扩展 1 pickle之文件操作 示例1 with open("test", 'rb') as f: lines = f.readlines() print(pic ...
- time()函数,dirname(__FILE__) 的使用总结
time()函数将返回从1970-1-1 0:0:0到当前时间的秒数.(整型) dirname(__FILE__) php中定义了一个很有用的常数,即 __file__ 这个内定常数是当前php程序的 ...
- mysql导入导出数据库命令
1.导出数据库:mysqldump -u 用户名 -p 数据库名 > 导出的文件名 如我输入的命令行: mysqldump -u root -p news > /home/jason/sq ...
- Linux查看硬盘型号
Linux查看硬盘型号 -- :: 分类: 服务器与存储 请先确定服务器是否有配 RAID. 如果有RAID,请通过对应的RAID管理(监控)工具查看,例如LSI的MegaCli: # /opt/Me ...
- NUI控件扩展
摘要:NUI组件是公司新一代的前端开发框架,它精致优雅的前端编程模型,是大家能够,或者想接受学习它的重要原因,在使用它的时候,一定不免会想增加自己的控件,让别人也能够如此优雅的使用. 其实NUI的扩展 ...
- python之打包相关
打包手册:https://python-packaging-user-guide.readthedocs.org/en/latest/installing.html#installing-from-a ...
- web开发架构设计
2015-07-31 13:10:38 一, web服务器 .负载均衡 .不做对URL的rewrite逻辑判断, 全部转发到代码服务器的单一入口文件, 由代码去全权处理 二, 代码服务器(常跟web服 ...