原文地址:

http://blog.csdn.net/zxz414644665/article/details/9308055

过程:用户调用service,服务端验证用户传来的用户名和密码(传输过程用X509证书验证及加解密),验证通过则给予调用服务。

1. 生成证书:这里只会生成一个测试用的证书(使用makecert.exe生成),生成完成之后再使用MMC Console给予相应的权限(Manage Private Keys…)。

makecert.exe -sr LocalMachine -ss My -n CN=MyServerCert -sky exchange –pe

2.Server端: 用VS2010 IDE新建一个“WCF Service Application”项目方案,实现我们自己的UserName认证方法,其实就是继承UserNamePasswordValidator(需要添加对System.IdentityModel.dll引用)并重写方法Validate。

  1. /// <summary>
  2. /// MyCustomValidator.cs
  3. /// </summary>
  4. public class MyCustomValidator: UserNamePasswordValidator
  5. {
  6. /// <summary>
  7. /// Override Validate method to implement custom validation
  8. /// </summary>
  9. /// <param name="userName">Username</param>
  10. /// <param name="password">Password</param>
  11. public override void Validate(string userName, string password)
  12. {
  13. if (string.IsNullOrEmpty(userName))
  14. {
  15. throw new ArgumentNullException("userName");
  16. }
  17. if (string.IsNullOrEmpty(password))
  18. {
  19. throw new ArgumentNullException("password");
  20. }
  21. // This is for testing purpose
  22. if (userName != "Admin" || password != "123456")
  23. {
  24. // Why we can't catch this fault exception in client
  25. FaultException fault =
  26. new FaultException(
  27. new FaultReason("UserName or password is wrong!"),
  28. new FaultCode("Error:0x0001"));
  29. throw fault;
  30. }
  31. }
  32. }

在这之后写我们的服务,很简单。

  1. [ServiceContract]
  2. public interface IValidationService
  3. {
  4. [OperationContract]
  5. string PrintMessage(string message);
  6. public class ValidationService : IValidationService
  7. {
  8. public string PrintMessage(string message)
  9. {
  10. Console.WriteLine("Message = " + message);
  11. return message;
  12. }

到这里Server端的代码基本上完成了,接下来就是如何让这些代码能够协同工作,那就需要修改我们的配置文件Web.config,有3个地方需要修改或者添加。

第一,添加binding,这里我们添加wsHttpBinding;

  1. <!-- Manually added bindings -->
  2. <bindings>
  3. <wsHttpBinding>
  4. <binding name="mySecurityBinding">
  5. <security mode="Message">
  6. <message clientCredentialType="UserName" />
  7. </security>
  8. </binding>
  9. </wsHttpBinding>
  10. </bindings>

第二,添加对UserName认证的配置,即serviceCredentials配置

  1. <!-- Manually added credentials -->
  2. <serviceCredentials>
  3. <serviceCertificate findValue="MyServerCert" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My" />
  4. <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WCFValidationServer.CustomValidation.MyCustomValidator,WCFValidationServer" />
  5. </serviceCredentials>

第三,配置必不可少的endpoint;

  1. <!-- Manually added service endpoint -->
  2. <services>
  3. <service behaviorConfiguration="WCFValidationServer.ValidationServiceBehavior" name="WCFValidationServer.ValidationService">
  4. <endpoint address="" binding="wsHttpBinding" contract="WCFValidationServer.IValidationService"
  5. bindingConfiguration="mySecurityBinding">
  6. <identity>
  7. <dns value="MyServerCert" />
  8. </identity>
  9. </endpoint>
  10. <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  11. </service>
  12. </services>

至此,Server端还需要做最后一件事情,即host到IIS中,这里就不多说了,测试host成功既可。

3.    Client端:同样的,用VS2010新建一个“ASP.NET Web Application”项目方案,添加对WCF service的引用,IDE会自动添加WCF的相关配置工作,这里有一点需要注意,因为我们的证书并不是真正意义上的证书,只是测试生成的,所以这个证书并不会通过验证,所以当我们客户端访问服务的时候会报错的(具体的错误不说了,自己试了就知道),我们需要在客户端添加一个自己的X509证书验证方法,这里为了测试方面,我们重新的Validate方法是空的,即不做任何认证判断。

  1. public class MyX509Validator : X509CertificateValidator
  2. {
  3. public override void Validate(System.Security.Cryptography.X509Certificates.X509Certificate2 certificate)
  4. {
  5. }
  6. }

好了,代码完成,同样我们需要修改客户端的Web.config配置文件来让这段代码起作用,添加如下的behavior,并将client的endpoint的behaviorConfiguration设置为我们添加的。

  1. <client>
  2. <endpoint address="http://localhost:8000/ValidationService.svc"
  3. binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IValidationService"
  4. contract="WCFValidationService.IValidationService" name="WSHttpBinding_IValidationService" behaviorConfiguration="myClientBehavior">
  5. <identity>
  6. <dns value="MyServerCert" />
  7. </identity>
  8. </endpoint>
  9. </client>
  10. <behaviors>
  11. <endpointBehaviors>
  12. <behavior name="myClientBehavior">
  13. <clientCredentials>
  14. <serviceCertificate>
  15. <authentication certificateValidationMode="Custom" customCertificateValidatorType="WCFValidationClient.MyX509Validator,WCFValidationClient" />
  16. </serviceCertificate>
  17. </clientCredentials>
  18. </behavior>
  19. </endpointBehaviors>
  20. </behaviors>

好了,至此我们的整个项目就完成了。客户端的界面及调用service就不说了,可以看我上载的源代码

【转载】WCF 客户端识别认证之UserName认证的更多相关文章

  1. 实现 Web 后端和客户端之间的分布式和认证通讯

    stack.io 是一个用于实现 Web 后端和客户端之间的分布式和认证通讯. 服务器端进程之间的通讯是非常高效的,因为没有中间的代理.而来自客户端的请求通过 socket.io 进入 Node.js ...

  2. 转载——Java与WCF交互(二):WCF客户端调用Java Web Service

    在上篇< Java与WCF交互(一):Java客户端调用WCF服务>中,我介绍了自己如何使用axis2生成java客户端的悲惨经历.有同学问起使用什么协议,经初步验证,发现只有wsHttp ...

  3. 【转载】ASP.NET网站选购阿里云服务器的时候,阿里云账号个人认证以及企业认证有何不同

    在采购阿里云产品,如阿里云云服务器.阿里云短信包.阿里云数据库MySql以及Sqlserver.阿里云对象存储OSS等云产品的时候,如果账号未进行实名认证,很多时候会要求实名认证操作,在实名认证时可选 ...

  4. java https单向认证(忽略认证)并支持http基本认证

    https单向认证(忽略认证)并支持http基本认证, 温馨提示 1,jar包要导入对 2,有匿名类编译要注意 3,欢迎提问,拿走不谢!背景知识 Https访问的相关知识中,主要分为单向验证和双向验证 ...

  5. 前端学HTTP之客户端识别和cookie

    前面的话 Web服务器可能会同时与数千个不同的客户端进行对话.这些服务器通常要记录下它们在与谁交谈,而不会认为所有的请求都来自匿名的客户端.本文主要介绍客户端识别及cookie机制 HTTP首部 HT ...

  6. asp.net权限认证:摘要认证(digest authentication)

    asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...

  7. 和我一起学《HTTP权威指南》——客户端识别与cookie机制

    客户端识别与cookie机制 服务器需要区别是哪个客户端. 个性化接触 HTTP是匿名.无状态的请求/响应协议. Web站点希望: 对客户端的用户有更多的了解 追踪用户浏览页面的行为 因此,产生了几种 ...

  8. [转]asp.net权限认证:摘要认证(digest authentication)

    本文转自:http://www.cnblogs.com/lanxiaoke/p/6357501.html 摘要认证简单介绍 摘要认证是对基本认证的改进,即是用摘要代替账户密码,从而防止明文传输中账户密 ...

  9. HTTP认证之摘要认证——Digest(一)

    导航 HTTP认证之基本认证--Basic(一) HTTP认证之基本认证--Basic(二) HTTP认证之摘要认证--Digest(一) HTTP认证之摘要认证--Digest(二) 一.概述 Di ...

随机推荐

  1. Mac下驱动BCM20702A0 USB蓝牙

    偶然高了一个USB蓝牙,查到Mac下能识别,无法驱动,就去找了一下.方法很简单,就是把蓝牙的PID和VID加入到驱动里边去,具体方法和步骤如下: 1. 进入到/System/Libary/Extens ...

  2. I/O复用及epoll基础知识

    IO multiplexing IO multiplexing这个词可能有点陌生,但是如果我说select,epoll,大概就都能明白了.有些地方也称这种IO方式为event driven IO.我们 ...

  3. [EntityFramework] 对 DateTime 类型使用 SQL 服务器时间或者字段默认值

    DateTime 类型在 SQL 服务器上如果设置了默认值,在 EntityFramework 添加新行的时候想使用该默认值,则不能对新增加的实体的 DateTime 字段赋值. 但是如果新增加的实体 ...

  4. 安装Window Server 2008的些配置

    上次安装window server2008,由于server2008需要设置很多东西,不然用起来很不爽,就说IE吧,每次随便打开一个网页都要弹出n多窗口出来叫你添加到信任域里面!太烦人了![下面有解决 ...

  5. Mybatis工作原理(含部分源码)

    MyBatis的初始化 1.读取配置文件,形成InputStream String resource = "mybatis.xml"; // 加载mybatis的配置文件(它也加载 ...

  6. 使用linux远程登录另一台linux

    可以用ssh命令行方式登录.对方需要开启ssh服务.   ssh [-l login_name] [-p port] [user@]hostname   例如,使用root用户登录 192.168.0 ...

  7. Linux 系统级别优化_【all】

    Linux 系统优化 1.Linux系统关闭SELinux 2.Linux系统开机到登录之前启动流程 3.Linux系统设置运行级别 4.Linux系统重要的开机自启动的服务 5.Linux查看系统当 ...

  8. session更换存储,实现在多台服务器共享

    场景 web服务器有多台,每台服务器都会存贮自己的session,session无法在多台服务器共享.所以就需要更换session的存贮空间,存贮在一个共用的空间.通常为了读写速度,我们会选择存贮在内 ...

  9. Hadoop HBase概念学习系列之HBase里的列式数据库(十七)

    列式数据库,从数据存储方式上有别于行式数据库,所有数据按列存取. 行式数据库在做一些列分析时,必须将所有列的信息全部读取出来 而列式数据库由于其是按列存取,因此只需在特定列做I/O即可完成查询与分析, ...

  10. (1)List集合 (2)Queue集合 (3)Set集合

    1.List集合(重中之重)1.1 基本概念 java.util.List接口是Collection接口的子接口,该接口中元素有先后放入次序并允许重复 该接口的主要实现类:ArrayList类.Lin ...