WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发

   继WSE3.0构建Web服务安全(1):WSE3.0安全机制与实例开发WSE3.0构建Web服务安全(2):非对称加密、公钥、密钥、证书、签名的区别和联系以及X.509 证书的获得和管理之后,今天我们继续WSE3.0构建Web服务安全系列文章的第3节:WSE3.0策略配置与实例开发.本节主要讲解如何通过WSE3.0策略配置工具实现Web服务安全,本在全文附带代码讲解。本节结构为1.WSE3.0策略工具介绍2.如何使用WSE3.0策略工具3.代码实现与分析4.总结。最后附上代码供大家下载。
      通过上2节的介绍我们知道:WSE 3.0是和Web Service整合在一起。通过对Web Service服务消息模型的扩展实现安全加密机制。 WSE 3.0中,客户端请访问Web服务是通过客户端生成的一个Proxy类来完成。当客户端向服务端发送Web Service调用请求的时候,WSE 3.0扩展框架会对消息进行一些处理,包括过滤、加密、签名等。而服务器端Web Service在收到客户端的调用请求后,WSE 3.0扩展框架同样会先对SOAP消息进行解密、签名的验证等操作。如果合法则相应用户请求,否则就抛出服务不可用异常给客户端。这些工作都是由WSE 3.0扩展框架自动完成解密、签名的验证等操。
      WSE 3.0提供的安全机制保证了Web Service的安全。同时实现安全的方式也有两种,一种就是通过的WSE3.0策略工具根据应用系统的安全规格给服务端和客户端设置相应的安全策略。其次就是用代码实现具体的安全策略相同的功能。第一种方式方便快捷,通过简单的设置即可完成Web服务的安全。后者用户可以定义更具体的代码来扩展自己的安全策略,相对来说需要自己写策略代码。不论采用那种方式,我们都可以利用WSE 3.0提供的安全机制守卫我们的Web服务。
      另外WSE 3.0也提供了其他的一些特性,例如多宿主托管Web服务、用户自定义的安全断言、对消息传输优化机制MTOM的支持、使用TCP传输控制协议传递SOAP消息等。我们也可以根据实际的系统需求来利用WSE 3.0提供的新特性,优化我们的系统。第一节中我们也提到在 Web Serivice项目中启用 WSE 3.0 的一个重要原因,就是要利用它的策略管道扩展性模型。因为WSEWSE 3.0 使您能够插入对进入和离开终结点的 SOAP 消息执行预处理和后续处理的筛选器,它提供的功能可以创建能够与WSEWSE 3.0 提供的现有声明性安全策略相结合的自定义声明性策略。下面我们来介绍一下WSE3.0配置工具,以及如何配置安全策略。
【1】WSE3.0策略工具介绍
    首先我们来介绍一下这个工具。WSE3.0具体的安装细节已经在第一节WSE3.0构建Web服务安全(1):WSE3.0安全机制与实例开发中做了介绍。当我们安装完毕会在新建的Web Service Vsual Studio 2005 项目右键菜单看到WSE 3.0设置。打开以后会出现配置工具的具体界面。如图:
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
     它包括的通用、安全、路由、策略、令牌问题、调试、消息7个选项卡。
1)通用选显卡包括是否在项目里支持WSE3.0和WSE3.0 SOAP消息工厂。
2)安全选显卡可以设置用户令牌管理类库,以及证书和消息的有效时间。
3)路由选项卡可以设置消息中介者SoapHttpRouter对进入和传出的消息加密。
4)策略选项卡可以更具安全需求对服务端和客户端设置特定的安全策略,策略会存储在相应的安全策略文件里。
5)令牌问题选项卡可以设置令牌的TTL有效存活时间。以及是否使用安全上下文令牌。
6)调试选项卡可以设置项目的具体调试的细节。消息输入和输出的的文件以及是否舒服错误信息等。
7)消息选项卡主要是对消息优化传输机制MTOM的一些设置。
【2】如何使用WSE3.0策略配置工具
     以上简单介绍了WSE3.0策略配置工具,下面我们来具体介绍主要选项的具体使用过程。
1)如果用户选择了项目里支持WSE3.0和WSE3.0 SOAP消息工厂。
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
     会在相应的配置WebConfig文件里自动添加一下信息。
<section name="microsoft.web.services3" type="Microsoft.Web.Services3.Configuration.WebServicesConfiguration, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
 
  <webServices>
   <soapServerProtocolFactory type="Microsoft.Web.Services3.WseProtocolFactory, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
  </webServices>
 </system.web>
     配置文件更新完毕代表刚才的设置成功。
2)用户可以在这里设置安全选显卡可以设置用户令牌管理类库,以及证书和消息的有效时间。如图
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
   这里设置的UsernameTokenManager类库为我们自己定义的类库,设置时要正确填写DLL的名称、命名空间、类的信息。完成以后会在配置文件里生成代码。
    <security>
      <securityTokenManager>
        <add type="MyUsernameTokenManager.MyUsernameTokenManager, UsernameTokenManagerClassLib" namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" localName="UsernameToken" />
      </securityTokenManager>
    </security>
3)路由选项卡可以设置消息中介者SoapHttpRouter对进入和传出的消息加密,这里就不做详细的介绍,具体大家可以参考MSDN。
4)策略选项卡可以更具安全需求对服务端和客户端设置特定的安全策略。用户可以决定是否使用策略和策略的管理。
服务端和客户端添加策略的文件类似,当用户选择添加策略文件的时候,会启动一个策略配置向导,你输入策略名称后,就可以继续下一步。如图
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
用户可以选择可以给客户端还是服务端进行策略设置,客户端认证方法包括4种。
A.Anonymous 匿名访问,不需要提供用户名和密码。服务器默认客户端请求已经进行加密。
B.Username 需要包含用户名和密码的Usernametoken的安全令牌。
C.Certificate 需要提供服务端认证的X.509证书。
D.Windows 需要提供服务端认证的KerberosT令牌,此方式不属于WS-*安全协议的范畴,使用Windows Kerberos 认证机制。
如果在向导中选择消息传输保护,还需要设置安全需求比如是否支持WS-*安全协议1.1扩展、签名、加密等策略,如图:
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
A.None :SOAP消息应当在传输层依赖安全套接层协议(SSL,Security Socket Layer)提供保护,WSE在传输层不提供保护。
B.Sign-Only :客户端需要对SOAP消息签名。保证消息的唯一性。
C.Sign and Encrypt:WSE对SOAP消息签名,且对SOAP消息体加密,来保证消息安全。
D.Sign, Encrypt, Encrypt Signature:WSE对 SOAP消息必须签名、消息体签名加密 、对签名进行加密。
     使用匿名方式生成的策略是
  <policy name="ServerPolicy">
    <usernameOverTransportSecurity />
    <requireActionHeader />
  </policy>
表示只依赖于传输层安全机制,但是这个安全级别比较低。消息容易被截获和破译。
5)令牌问题选项卡可以设置令牌的TTL有效存活时间。以及是否使用安全上下文令牌。
 令牌生存期为30秒,设置后对应的配置文件节点为
    <tokenIssuer>
      <ttlInSeconds value="30" />
    </tokenIssuer>
6)调试选项卡可以设置项目的具体调试的细节。消息输入和输出的的文件以及是否舒服错误信息等。
具体的设置后生成的配置节点如下:
    <diagnostics>
      <trace enabled="true" input="InputTrace.webinfo" output="OutputTrace.webinfo" />
      <detailedErrors enabled="true" />
    </diagnostics>
这样可以输入错误消息,便于调试。
7)消息选项卡主要是对消息优化传输机制MTOM的一些设置。
 如果使用消息优化机制,可以设置相应的选项,
    <messaging>
      <mtom clientMode="On" serverMode="always" />
    </messaging>
     这样表示一直使用消息优化传输机制。
【3】代码实现与分析
      通过上面对WSE3.0配置工具的消息介绍,现在我们来使用WSE3.0配置工具来进行简单的项目配置。
     在介绍代码实现以前,先要强调一点,WSE3.0安全机制的工作原理,比如签名。我们在使用策略工具进行设置,对消息消息签名,会要求你提供一个X509证书,也就是服务端认证的公钥。来对消息加密。服务端配置的策略的同时会在服务端提供对应的私钥进行解密,我们要做的就是提供认证的证书和设置安全策略文件。加密和解密验证的过程由WSE3.0来为我们完成。下面我们还是以上次的代码的基础上,来演示我们的具体WSE3.0策略工具的配置过程。使用证书的加密和解密的代码我会给出讲解,但是就不会给具体的实现了。(XP无法安装证书服务机构,自己制作的证书需要认证通过后,才能使用)几种方式的配置有类似之处,大家有兴趣可以查阅MSDN的资料。或者留言交流。
1)服务端:服务器端策略配置使用Username 方式,需要客户端提供用户名和密码的Usernametoken的安全令牌。具体策略文件对应节点如下:
  <policy name="ServerPolicy">
    <usernameOverTransportSecurity />
    <requireActionHeader />
  </policy>
服务端代码需要做相应的更改,添加使用策略的属性标识Microsoft.Web.Services3.Policy("ServerPolicy")]。具体代码如下:
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发[Microsoft.Web.Services3.Policy("ServerPolicy")]
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
public class Service : System.Web.Services.WebService
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
{
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发    
public Service () {
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发        
//Uncomment the following line if using designed components 
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发        
//InitializeComponent(); 
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
    }

WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发    [WebMethod]
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发    
public string HelloWorld()
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发    
{
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发        
return "Hello Guys, Frank Xu Lei.is testing WSE3.0 Setting PolicyWSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发";
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发    }

WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发    
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发}

WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
 
2)客户端:
客户端与服务端配置相对应的安全策略。即提供用户名和密码的Usernametoken的安全令牌。策略相同:
  <policy name="ClientPolicy">
    <usernameOverTransportSecurity />
    <requireActionHeader />
  </policy>
 客户端的测试代码做做了相应更新。 需要设置代理策略,语句是serviceProxy.SetPolicy("ClientPolicy");具体代码如下
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发 // 创建Web service proxy的实例 
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
            ServiceWse serviceProxy = new ServiceWse();
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发            
//通过UsernameToken类的实例添加用户名与口令。
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
            UsernameToken token = new UsernameToken("FrankXu""123456789", PasswordOption.SendPlainText);
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发            
//MessageSignature _messageSignature = new MessageSignature(token);
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发            
//_messageSignature.SigningKey
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发            
// 设置用户令牌到服务代理
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
            serviceProxy.SetClientCredential(token);
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发            
// 代理设置策略
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
            serviceProxy.SetPolicy("ClientPolicy");
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发            
//调用服务方法
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
            string result = serviceProxy.HelloWorld();
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发            
try
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发            
{
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发                Console.WriteLine(result);
//打印结果
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
                Console.WriteLine("Calling {0}", result);
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发            }

WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发            
catch (Exception ex)
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发            
{
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发                Console.WriteLine(ex.Message);
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发            }

WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发            
//释放对象资源
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
            if(serviceProxy != null)
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发            serviceProxy.Dispose();
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发            
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发            
// Success!
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
            Console.WriteLine("Web Service called successfully");
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发            
//For debug
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
            Console.WriteLine("Press any key to continueWSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发");
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发            Console.ReadLine();

这个表示服务端和客户端使用了相同的安全策略。客户端按照策略把用户名和密码封装到UsernameToken里,添加到Soap消息里,发送给服务端。服务端根据策略解析Soap消。反序列化UsernameToken。然后进行用户名和密码的安全验证。
3)运行演示:
WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
【4】总结
      另外如果用户服务安全使用签名,加密,加密使用到证书等安全策略,可以使用WSE3.0配置工具设置具体策略到wse3policyCache.config文件中,来实现系统的安全。此外也可以使用WSE3.0提供的类库来利用代码实现。代码如下:
            //如下代码实现了和 wse3policycache.config一样的策略功能
            UsernameForCertificateAssertion assertion = new UsernameForCertificateAssertion();
            //设置 X509证书到安全断言.
            assertion.X509TokenProvider = new X509TokenProvider(StoreLocation.CurrentUser,
                                                                StoreName.AddressBook,
                                                                "CN=WSE2QuickStartServer",//证书
                                                                X509FindType.FindBySubjectDistinguishedName);
            //设置签名选项。
            assertion.Protection.Request.SignatureOptions = SignatureOptions.IncludeAddressing |
                                                 SignatureOptions.IncludeTimestamp |
                                                 SignatureOptions.IncludeSoapBody;
            //加密消息主体
            assertion.Protection.Request.EncryptBody = true;
    以上就是对WSE3.0配置工具的使用过程的详细介绍。我们了解了整合WSE3.0配置工具相关的概念和使用方法,以及使用WSE3.0配置工具对具体的项目进行安全设置的实现过程。希望通过本文的介绍,大家能对WSE3.0实现Web服务的安全有个新的了解。基础知识和概念请参考本系列的前两节。在调试WSE3.0安全项目的时候遇到的错误以及解决办法我也放到博客的开发常见错误解决系列文章里。最后放上本文的实现代码/Files/frank_xl/WSE3UserNameTokenWithPolicyCodedByFrankXuLei.rar,供大家参考。因为最近比较忙,所以本节文章准备时间花费了一周,希望能对大家的学习有点帮助,也欢迎留言交流。谢谢~~



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


上一篇:Appium+python自动化16-appium1.6在mac上环境搭建启动ios模拟器上Safari浏览器


下一篇:D3D9学习笔记(三) Device