转载地址: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文件代码:

宿主程序 App.config 代码

启动服务器端宿主程序后,更新Client1 的服务引用,并修改调用代码如下:

Client1 Main 函数代码

我们的代码修改完成,我们运行一下客户端Client1,并输入用户名 admin 和密码 123456,可以成功调用服务:

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

至此,我们利用用户名密码方式对客户端进行验证的这个Demo ,就结束了,下一篇我们来演示一下传输安全中对客户端也使用证书方式的认证。

本例源码下载

重温WCF之WCF传输安全(十三)(3)基于SSL的WCF对客户端验证(转)的更多相关文章

  1. 基于SSL的WCF传输安全

    [实践]WCF传输安全1:前期准备之证书制作   [实践]WCF传输安全2:基于SSL的WCF匿名客户端   [实践]WCF传输安全3:基于SSL的WCF对客户端验证   [实践]WCF传输安全4:基 ...

  2. 重温WCF之WCF传输安全(十三)(4)基于SSL的WCF对客户端采用证书验证(转)

    转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/20/2695397.html 前一篇我们演示了基于SSL的WCF 对客户端进行用户名和密码方式的 ...

  3. 重温WCF之WCF传输安全(十三)(2)基于SSL的WCF匿名客户端(转)

    转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/13/2683514.html 这一篇我们利用上一篇制作的证书,来演示一个基于SSL的WCF服务, ...

  4. WCF分布式开发步步为赢(4):WCF服务可靠性传输配置与编程开发

    今天继续WCF分布式开发步步为赢系列的第4节:WCF服务可靠性传输配置与编程开发.这个章节,我们要介绍什么是WCF服务的可靠性传输,随便介绍网络协议的概念,Web Service为什么不支持可靠性传出 ...

  5. WCF 笔记 (2) - 传输泛型 List 对象

    WCF 笔记 (2) - 传输泛型 List 对象 本帖介绍怎么在 WCF 中,在 Server-side 和 Client-side 之间,传递默认无法传输的 List<T>.List& ...

  6. C# WCF学习笔记(二)终结点地址与WCF寻址(Endpoint Address and WCF Addressing) WCF中的传输协议

    URI的全称是 Uniform Rosource Identifire(统一资源标识),它唯一标识一个确定的网绐资源,同时也表示资源所处的位置及访问的方式(资源访问所用的网络协议). 对于Endpoi ...

  7. 使用Fiddler解析WCF RIA Service传输的数据

    原文 http://www.cnblogs.com/wintersun/archive/2011/01/05/1926386.html 使用Fiddler 2 解析WCF RIA Service传输的 ...

  8. WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[下篇]

    原文:WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[下篇] 在[第2篇]中,我们深入剖析了单调(PerCall)模式下WCF对服务实例生命周期的控制,现在我们来 ...

  9. 转:wcf大文件传输解决之道(2)

    此篇文章主要是基于http协议应用于大文件传输中的应用,现在我们先解析下wcf中编码器的定义,编码器实现了类的编码,并负责将Message内存中消息转变为网络发送的字节流或者字节缓冲区(对于发送方而言 ...

随机推荐

  1. 500 OOPS: vsftpd: both local and anonymous access

    配置ftp服务器,有如下报错 C:\netos74\bin>ftp 10.20.100.252Connected to 10.20.100.252.500 OOPS: vsftpd: both ...

  2. Hello,World

    引用自http://www.cnblogs.com/jbelial/archive/2013/05/08/3067471.html#2676127 题目: 1 public class text { ...

  3. linux回收站设计

    linux回收站设计 在windows下有一个很好的东西,那就是回收站,虽然有很多人批评它.linux不是没有回收站,很多桌面环境都可以看到是有回收站的. 这里是讨论如何设计一个回收站,而不是有没有的 ...

  4. GCD-Grand Central Dispatch

    经常要用的,总结分类一下. //获得队列 DISPATCH_QUEUE_PRIORTY 优先级 dispatch_queue_t Queue = dispatch_get_global_queue(D ...

  5. Python自动化之socket初识

    1. os.popen() os.system(cmd)会直接输出命令的结果到屏幕上,返回一个状态码0或1. os.popen(cmd)会返回一个<open file 'dir', mode ' ...

  6. Java Log4j日志使用

    在程序中使用log4j 1.导入包import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator; 2.获取lo ...

  7. 【转】【编码】ANSI,ASCII,Unicode,UTF8之一

          不同的国家和地区制定了不同的标准,由此产生了 GB2312.GBK.GB18030.Big5.Shift_JIS 等各自的编码标准.这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称 ...

  8. python查找并删除相同文件-UNIQ File-script版本

    今天用wxPython做了一个GUI程序,实现查找指定目录内的相同文件,主要原理是计算文件的md5值(计算前先找出文件大小相同的文件,然后计算这些文件的md5值,而不是所有文件都计算,大大减少了md5 ...

  9. POJ 1458 1159

    http://poj.org/problem?id=1458 一道容易的DP,求最长公共子序列的 dp[i][j],代表str1中的第i个字母和str2中的第j个字母的最多的公共字母数 #includ ...

  10. ios NSNotificationCenter 收到通知后的执行线程

    https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Notifications/Articles/Thread ...