WCF分布式安全开发实践(10):消息安全模式之自定义用户名密:Message_UserNamePassword_WSHttpBinding 
    文章主要是消息安全模式下的UserNamePassword身份验证方式,基于WSHttpBinding绑定协议。主要内容:制作证书、服务验证代码、服务端配置、客户端配置、总结等5个部分。依次是最重要的5个步骤。
    下面我们来介绍具体的内容,首先就是要制作一个服务端使用的证书,用来建立TLS传输安全层会话使用。
【1】制作证书:
 (1)使用makecert 工具:Microsoft Visual Studio 2008-->Visual Studio Tools-->Visual Studio 2008 命令提示行。输入:makecert -r -pe -n "CN=FrankWCFServer" -ss My -sky exchange
 (2) 打开浏览器---->Internet 选项----->内容----->证书----->个人,默认是保存到当前用户CurrentUser,你会看到刚才制作的证书。如图:

也可以使用MMC建立证书控制单元,里查看证书的信息:
  开始--运行--MMC--控制台--添加删除单元--证书--当前用户和计算机各添加一个。能查看和管理CurrentUser和LocalMachine的所有证书。如图:

(3)如果证书不可以使用,可以参考设置证书为可信任的步骤:WCF分布式开发常见错误(22):The caller was not authenticated...如何在XP系统为WCF设置可信任的证书有介绍。
【2】服务验证代码:
    证书制作完整以后,就需要来实现自定义用户名和密码的验证程序。这里要重写MyUserNamePasswordValidator类的Validate(string userName, string password)方法。具体代码如下:

public class MyUserNamePasswordValidator : UserNamePasswordValidator 
    { 
        public override void Validate(string userName, string password) 
        {
            if (userName != "FrankXuLei" || password != "12345678")
            {
                Console.WriteLine("UserNamePasswordValidatation is failed !:{0}", userName);
                throw new SecurityTokenException("Unknown Username or Password"); 
            }
            else
            {
                Console.WriteLine("UserNamePasswordValidatation is sucessfully !:{0}", userName);
            }
        } 
    } 

这里假定用户名是FrankXuLei,密码是123456.如果不对就直接抛出异常,验证失败,实际应用我们可以到身份验证数据库查询数据,来判定用户名和密码的有效性。
【3】服务端配置:
  托管宿主的配置较为复杂,除了要配置服务端证书,还要配置绑定的安全模式,以及自定义身份验证程序集。
(1)配置服务端证书:
      设置刚才制作的证书,配置文件如下:

<serviceCertificate  x509FindType="FindBySubjectName" findValue="WCFServerCertificate" storeLocation="CurrentUser"/>

根据主题名称到当前用户的查找证书。还可以根据证书指纹等方式查找。
(2)配置绑定的安全模式:
    这里使用的绑定要支持消息安全模式的自定义用户名和密码,可以从第一篇文章WCF分布式安全开发实践(0):文章和代码结构规划介绍和WCF分布式开发步步为赢(14):WCF安全编程--基本概念找到适合的绑定协议。这里就以WSHTTPBinding为例子。配置代码如下:

 <wsHttpBinding>
        <binding  name="MessageAndUserName"   >
          <security  mode="Message">
            <transport clientCredentialType="None"/>
            <message clientCredentialType="UserName"/>
          </security>
        </binding>
      </wsHttpBinding>

消息安全模式启用UserName验证方式。
(3)配置自定义身份验证程序集:
   下面我们来配置一下自定义实现的身份验证程序集,配置代码如下:

<userNameAuthentication userNamePasswordValidationMode="Custom"    customUserNamePasswordValidatorType="WCFService.MyUserNamePasswordValidator,WCFService" />
          

这里要注意,前面是命名空间和类,逗号后面就是服务名称。
 (4)服务代码:
   这里的服务代码很简单,string HelloMessageSecurity(string name);会根据传入的名称来答应消息。为了测试加了打印时间,代码如下:

 //1.服务契约
    [ServiceContract(Namespace = "http://www.cnblogs.com/frank_xl/")]
    public interface IWCFService
    {
        //操作契约
        [OperationContract]
        string HelloMessageSecurity(string name);

}
    //2.服务类,继承接口。实现服务契约定义的操作
    //2.服务类.单调服务
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class WCFService : IWCFService
    {
        //实现接口定义的方法
        public string HelloMessageSecurity(string name)
        {
            //提供方法执行的上下文环境
            OperationContext context = OperationContext.Current;
            //获取传进的消息属性
            MessageProperties properties = context.IncomingMessageProperties;
            //获取消息发送的远程终结点IP和端口
            RemoteEndpointMessageProperty endpoint = properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
            Console.WriteLine(string.Format("Hello {0},You are  from {1}:{2}", name, endpoint.Address, endpoint.Port));
            return string.Format("Hello {0},You are  from {1}:{2}", name, endpoint.Address, endpoint.Port);
        }
    }

【4】客户端配置:
    运行托管宿主,客户端添加服务引用,直接生成相关代码文件。我们直接添加代码测试,这里要测试两种情况,正确的用户名和密码,错误的用户名或者密码。前者成功。客户端测试代码如下:

using (ClientProxy.WCFServiceClient ClientProxy = new ClientProxy.WCFServiceClient("WSHttpBinding_IWCFService"))
            {
                string strUserName = "Frank Xu Lei ";
                string strMessage = "";
                //通过代理调用SayHelloToUser服务
                ////正确测试密码
                ClientProxy.ClientCredentials.UserName.UserName = "FrankXuLei";
                ClientProxy.ClientCredentials.UserName.Password = "12345678";              
                //Console.WriteLine(strMessage);
                //错误测试密码

//ClientProxy.ClientCredentials.UserName.UserName = "FrankXuLei";
                //ClientProxy.ClientCredentials.UserName.Password = "88888888";
                //strMessage = wcfServiceProxy.HelloMessageSecurity(strUserName);
                strMessage = ClientProxy.HelloMessageSecurity(strUserName);
                Console.WriteLine(strMessage);
            }
            //For Debug
            Console.WriteLine("Press any key to continue");
            Console.Read();

【5】总结:
    启动托管宿主,然后启动客户端调用服务进行测试,运行结果如图:

这个系列先从这个文章开始,主要是这个代码已经实现很久了,一直因为太忙没有写出文章,今天加班搞定。
(1):使用 .NET Framework 3.5 版 或更高版本时,可将自定义用户名和密码验证程序与消息和传输安全一起使用。使用 .NET Framework 3.0 时,自定义用户名和密码验证程序只能与消息安全一起使用。
(2):代码示例重写的 Validate 方法。如果在实际的项目里可以替换为您的自定义用户名和密码验证方案,从数据库检索用户名和密码来进行比较。你可以访问数据库或者其它的账号安全验证的数据进行验证。也是最灵活的方式之一,用户可以根据需要来定义身份验证机制。
(3):与WSE3.0的身份验证机制略有不同的是这里要使用到证书,原因是消息安全模式下,需要使用证书来建立TLS传输安全层,是WS-Trust规范,SSL安全套接层的升级安全规范。因此需要证书。
(4):提供本文的Demo程序的下载,
/Files/frank_xl/6.4.WCFServiceSecurityDemoFrankXuLei_Message_UserNamePassword_WSHttpBinding.rar
   时间仓促,有不足的地方请多多包含。 欢迎大家提出意见,互相交流学习。如果程序运行相关问题可以留言或者到WCF中文论坛来交流~谢谢
参考文章:
1.WCF分布式开发常见错误(22):The caller was not authenticated...如何在XP系统为WCF设置可信任的证书
2.WCF分布式开发常见错误(21):unable to open its IChannelListener.分发器未能打开侦听器
3.http://social.microsoft.com/Forums/zh-CN/wcfzhchs/thread/e1aa7bea-90d8-41e6-b91b-7addba44f8e3
4.WSE3.0构建Web服务安全(2):非对称加密、公钥、密钥、证书、签名的区别和联系以及X.509 证书的获得和管理,具体5.http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cptools/html/cpgrfcertificatecreationtoolmakecertexe.asp

转载于:https://blog.51cto.com/frankxulei/320373

WCF分布式安全开发实践(10):消息安全模式之自定义用户名密码:Message_UserNamePassword_WSHttpBinding...相关推荐

  1. WCF分布式安全开发实践(6):传输安全模式之自定义X509Certificate证书验证

    今天继续WCF分布式安全开发实践(6):传输安全模式之自定义X509Certificate证书验证.本文介绍的内容主要是:主要是传输安全模式的UserNamePassword身份验证方式,基于WSHt ...

  2. WCF分布式安全开发实践(9):消息安全模式之Windows身份验证:Message_Windows_NetTcpBinding...

    今天继续WCF分布式安全开发实践(9):消息安全模式之Windows身份验证:Message_Windows_NetTcpBinding.本文介绍的内容主要是:主要是消息安全模式的Windows身份验 ...

  3. WCF分布式安全开发实践(1):传输安全模式之匿名客户端:Transport_None_WSHttpBinding

    WCF分布式安全开发实践(1):传输安全模式之匿名客户端:Transport_None_WSHttpBinding      主要是传输安全模式的None身份验证方式,基于WSHttpBinding绑 ...

  4. WCF从理论到实践(10):异常处理 (转)

    WCF从理论到实践(10):异常处理 本文目的 通过阅读本文,您能理解以下的知识 1) WCF中存在哪几种异常处理方式? 2) 各种异常处理所适用的应用场合? 3) WCF中常见的异常类型? 4) 代 ...

  5. 阿里专有云OpenAPI开发实践之消息队列

    目录 阿里专有云OpenAPI开发实践之消息队列 环境介绍 文档资料 消息队列MQ产品的Endpoint 消息队列产品没有相应的SDK 简单调用示例 RAM授权 <开发指南>之外的Open ...

  6. Android组件化开发实践(九):自定义Gradle插件

    本文紧接着前一章Android组件化开发实践(八):组件生命周期如何实现自动注册管理,主要讲解怎么通过自定义插件来实现组件生命周期的自动注册管理. 1. 采用groovy创建插件 新建一个Java L ...

  7. java wcf 未提供用户名_WCF安全之自定义用户名密码验证方式 | 学步园

    概述 Windows Communication Foundation (WCF) 是 Microsoft 为构建面向服务的应用程序而提供的统一编程模型(摘自MSDN),在分布式环境下的安全问题尤为重 ...

  8. WCF分布式开发常见错误(26):Authentication failed

    这个也是WCF分布式安全开发实践过程里常见的错误.  验证失败,因为远端已经关闭传输流.     WCF 传输安全模式下,客户端和服务器端使用证书进行验证.WSHttpBinding.启动服务宿主程序 ...

  9. WCF与AJAX编程开发实践(1):AJAX基础概念和纯AJAX示例

    [0]开篇序言:     在<WCF分布式安全开发实践>系列文章之后,很想重新开启一个系列文章,来完善WCF的学习知识.思考很久,决定写一下WCF和AJAX学习的文章,取名为<WCF ...

  10. 艾伟:WCF从理论到实践(11)-异步

    本系列文章导航 WCF从理论到实践(1):揭开神秘面纱 WCF从理论到实践(2):决战紫禁之巅 WCF从理论到实践(3):八号当铺之黑色契约 WCF从理论到实践(4):路在何方 WCF从理论到实践(5 ...

最新文章

  1. 我在硅谷工作的第四年:技术是怎么把信息变现的
  2. 获取系统昨日最高峰时的AWR报告,get_hight_load_awr
  3. Android集成Firebase(含Analytics功能)
  4. vue3 v-model变化
  5. 西澳大学商科专业排名_澳洲西澳大学优势专业排名多少
  6. Storm Trident拓扑中的错误处理
  7. Delphi 与 DirectX 之 DelphiX(49): TDIB.DoGrayScale;
  8. 在队列同步器中,同步队列为什么是双向链表,而等待队列是单链表?
  9. SpringBoot 中使用 QuzartZ
  10. 硬笔行书字帖3500常用字_硬笔行书教程:偏旁部首写法字帖(附例字)
  11. python中1 100的质数_Python求解1到100之间的质数
  12. 8月书讯丨11本新上好书速览(计算机+经管)
  13. RegNet: Designing Network Design Spaces
  14. 华为笔记本没有网线口_有的笔记本电脑没有网线插口吗?
  15. 广域网接口规范(v.35)
  16. 汽车常识全面介绍 - 引擎详论
  17. 开篇:数据驱动UI的设计理念
  18. GitHub 与 win 有一天竟然能合体
  19. 多个dwg文件批量转换成jpg格式
  20. jsp include标签使用

热门文章

  1. 更强大的技术团队和更雄厚的预算,海外高频巨头抢占中国市场,不少本土团队淘汰出局
  2. 【优化算法】世界杯优化算法(WCOA)【含Matlab源码 1427期】
  3. 【房价预测】基于matlab Elman神经网络房价预测【含Matlab源码 589期】
  4. 【图像处理】基于matlab Hough变换人眼虹膜定位【含Matlab源码 387期】
  5. camvid数据集使用方法_github资源推荐:目标姿态检测数据集与渲染方法
  6. 人工智能与自动驾驶汽车_自动驾驶汽车中的道德AI
  7. java js cookie_[Java教程]js简单操作Cookie
  8. 计算机组成与系统 报告,计算机组成与系统结构课设报告.docx
  9. win8这台计算机到桌面上,Win8如何在桌面上显示“我的电脑”图标,小编教你Win8如何在桌面上显示我的电脑...
  10. mysql sql语法区别_sql和mysql语法有什么不同