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

简介:
  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



 本文转自 frankxulei 51CTO博客,原文链接:http://blog.51cto.com/frankxulei/320373,如需转载请自行联系原作者






相关文章
|
2月前
|
数据管理 API 调度
鸿蒙HarmonyOS应用开发 | 探索 HarmonyOS Next-从开发到实战掌握 HarmonyOS Next 的分布式能力
HarmonyOS Next 是华为新一代操作系统,专注于分布式技术的深度应用与生态融合。本文通过技术特点、应用场景及实战案例,全面解析其核心技术架构与开发流程。重点介绍分布式软总线2.0、数据管理、任务调度等升级特性,并提供基于 ArkTS 的原生开发支持。通过开发跨设备协同音乐播放应用,展示分布式能力的实际应用,涵盖项目配置、主界面设计、分布式服务实现及部署调试步骤。此外,深入分析分布式数据同步原理、任务调度优化及常见问题解决方案,帮助开发者掌握 HarmonyOS Next 的核心技术和实战技巧。
255 76
鸿蒙HarmonyOS应用开发 | 探索 HarmonyOS Next-从开发到实战掌握 HarmonyOS Next 的分布式能力
|
1月前
|
数据采集 人工智能 分布式计算
MaxFrame:链接大数据与AI的高效分布式计算框架深度评测与实践!
阿里云推出的MaxFrame是链接大数据与AI的分布式Python计算框架,提供类似Pandas的操作接口和分布式处理能力。本文从部署、功能验证到实际场景全面评测MaxFrame,涵盖分布式Pandas操作、大语言模型数据预处理及企业级应用。结果显示,MaxFrame在处理大规模数据时性能显著提升,代码兼容性强,适合从数据清洗到训练数据生成的全链路场景...
94 5
MaxFrame:链接大数据与AI的高效分布式计算框架深度评测与实践!
|
1月前
|
存储 运维 安全
盘古分布式存储系统的稳定性实践
本文介绍了阿里云飞天盘古分布式存储系统的稳定性实践。盘古作为阿里云的核心组件,支撑了阿里巴巴集团的众多业务,确保数据高可靠性、系统高可用性和安全生产运维是其关键目标。文章详细探讨了数据不丢不错、系统高可用性的实现方法,以及通过故障演练、自动化发布和健康检查等手段保障生产安全。总结指出,稳定性是一项系统工程,需要持续迭代演进,盘古经过十年以上的线上锤炼,积累了丰富的实践经验。
|
2月前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
阿里云容器服务ACK提供强大的产品能力,支持弹性、调度、可观测、成本治理和安全合规。针对拥有IDC或三方资源的企业,ACK One分布式云容器平台能够有效解决资源管理、多云多集群管理及边缘计算等挑战,实现云上云下统一管理,提升业务效率与稳定性。
|
2月前
|
机器学习/深度学习 存储 运维
分布式机器学习系统:设计原理、优化策略与实践经验
本文详细探讨了分布式机器学习系统的发展现状与挑战,重点分析了数据并行、模型并行等核心训练范式,以及参数服务器、优化器等关键组件的设计与实现。文章还深入讨论了混合精度训练、梯度累积、ZeRO优化器等高级特性,旨在提供一套全面的技术解决方案,以应对超大规模模型训练中的计算、存储及通信挑战。
119 4
|
3月前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
101 8
|
5月前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
3年前的云栖大会,我们发布分布式云容器平台ACK One,随着3年的发展,很高兴看到ACK One在混合云,分布式云领域帮助到越来越多的客户,今天给大家汇报下ACK One 3年来的发展演进,以及如何帮助客户解决分布式领域多云多集群管理的挑战。
阿里云容器服务 ACK One 分布式云容器企业落地实践
|
4月前
|
NoSQL Java Redis
开发实战:使用Redisson实现分布式延时消息,订单30分钟关闭的另外一种实现!
本文详细介绍了 Redisson 延迟队列(DelayedQueue)的实现原理,包括基本使用、内部数据结构、基本流程、发送和获取延时消息以及初始化延时队列等内容。文章通过代码示例和流程图,逐步解析了延迟消息的发送、接收及处理机制,帮助读者深入了解 Redisson 延迟队列的工作原理。
|
6月前
|
开发者 云计算 数据库
从桌面跃升至云端的华丽转身:深入解析如何运用WinForms与Azure的强大组合,解锁传统应用向现代化分布式系统演变的秘密,实现性能与安全性的双重飞跃——你不可不知的开发新模式
【8月更文挑战第31天】在数字化转型浪潮中,传统桌面应用面临新挑战。本文探讨如何融合Windows Forms(WinForms)与Microsoft Azure,助力应用向云端转型。通过Azure的虚拟机、容器及无服务器计算,可轻松解决性能瓶颈,满足全球用户需求。文中还提供了连接Azure数据库的示例代码,并介绍了集成Azure Storage和Functions的方法。尽管存在安全性、网络延迟及成本等问题,但合理设计架构可有效应对,帮助开发者构建高效可靠的现代应用。
55 0
|
6月前
|
UED 存储 数据管理
深度解析 Uno Platform 离线状态处理技巧:从网络检测到本地存储同步,全方位提升跨平台应用在无网环境下的用户体验与数据管理策略
【8月更文挑战第31天】处理离线状态下的用户体验是现代应用开发的关键。本文通过在线笔记应用案例,介绍如何使用 Uno Platform 优雅地应对离线状态。首先,利用 `NetworkInformation` 类检测网络状态;其次,使用 SQLite 实现离线存储;然后,在网络恢复时同步数据;最后,通过 UI 反馈提升用户体验。
148 0