在wse视图工具中,其中的两个选项卡:策略(Policy)和安全(Secury)
1 策略是对安全的控制
2 安全选项卡中可以设置对于安全控制的策略组件的设置,例如用户令牌管理,证书管理
策略分两种,服务端和客户端。在添加策略文件时,验证项(用户的授权)可以有四种选择:
Anonymous(匿名用户):这种类型不要求有客户凭证
Username(用户):这种类型要求客户端传递一个用户令牌凭证,凭证中包含用户名和用户密码
Certifacate(证书):这种类型要求客户端传递一个证书令牌,令牌中包含x.509证书
Windows(windows):这种类型要求客户传递kerberos令牌,其中包括一个windows标识。
对soap消息进行保护的类型也有四种:
None(无):由SSL传输提供soap消息的保护。WSE不强求
Sign-Only(只签名):只对soap消息进行签名
Sign and Encrypt(签名并加密):对soap消息进行签名且加密
Sign,Encrypt,Encrypt Signature(签名,加密,加密签名):对soap消息进行签名,且对soap包体和签名进行加密。
在程序中以MessageProtectionOrder枚举来表示:
·EncryptBeforeSign:在签名前加密soap消息
·SignBeforeEncrypt:加密前要签名,但签名不加密
·SignBeforeEncryptAndEncryptSignature:加密前要签名,然后签名也要加密
Wse配置工具是对config文件的界面操作工具,在xml中,属性值与这个枚举值相同:
messageProtectionOrder="SignBeforeEncrypt"
现在说说策略断言(Policy Assertion)
策略断言定义了一组在服务器和客户进行soap消息交换的要求。例如一个策略断言可能会指定一个用来对在服务器和客户之间进行的soap消息交换进行加密和签名的令牌类型。为了指定安全要求,添加为策略断言添加一个或多个turnkey或自定义的安全断言。策略断言,通过xml元素来声明,例如像下边这个例子中的<anonymousForCertificateSecurity>元素。
<anonymousForCertificateSecurity>
<serviceToken></serviceToken>
<protection>
<reques/>
</protection>
</anonymousForCertificateSecurity>
(一)不启用策略
不启用策略时,就是不配置WSE的Policy部分。只是对ws启用WSE增强。这个很简单。
·服务端:在可视工具上的常规选项卡上勾选2项(如果不是网站项目,则不能添加soap protocol factory)
·客户端(例如类库项目):在可视工具常规选项卡上勾选1项,这项的主要作用就是添加对Microsoft.Web.Services3的引用。
在客户端使用时,使用带WSE后辍的代理类实例来实现对服务的请求:
FirstInstance.WebServiceWse client = new FirstInstance.WebServiceWse();
(二)启用策略之匿名用户
匿名用户anonymous不要求有客户凭证,而对消息的保护如果要有签名或加密,须启用证书,有关证书的相关内容请见:
http://www.cnblogs.com/jams742003/archive/2010/04/12/1710124.html
http://www.cnblogs.com/jams742003/archive/2010/04/20/1716253.html
这里启用匿名用户:
·服务端策略选项卡上添加服务端策略,添加完毕后,在服务上以修饰标签的形式启用策略。
·客户端启用相同的策略,但策略名不同。在应用时,可在代码中启用策略
·在消息保护项有3项可选择,所以这里需要一张证书
服务端:
1 策略选项卡——添加策略——策略名(ServerPolicy)——匿名——签名——选择证书——完成
2 在服务类添加修饰以启用策略
[Microsoft.Web.Services3.Policy("ServerPolicy")]
public class WebService : System.Web.Services.WebService
客户端:
1策略选项卡——添加策略——策略名(ClientPolicy)——匿名——签名——选择证书——完成
2 在代码中启用策略:
client.SetPolicy("ClientPolicy");
这里给出一段启用匿名用户策略且对消息进行签名的soap包部分:
<Signature
xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<ds:CanonicalizationMethod
Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#" />
<SignatureMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1" />
<Reference URI="#Id-c7c03d5c-6e4b-493e-b3e8-c50ba9c27088">
<Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>1tzz6zotjDSBNQf0UhyrqfA2G6I=</DigestValue>
……
在匿名用户策略下,消息保护可选择3种方式:
Sign-Only(只签名)
Sign and Encrypt(签名并加密)
Sign,Encrypt,Encrypt Signature
在上段例子中用的是第一种。在包中的包体部分可以看到:
<soap:Body>
<HelloWorld xmlns="http://tempuri.org/">
<strName>Songjiang</strName>
</HelloWorld>
</soap:Body>
Web方法传入参数是明文形式。这个部分由策略断言设置,在原设置中,请求部分的包体加密属性为false:
encryptBody="false"
现在改为要求加密包体,然后看包体中的参数部分:
<soap:Body>
<xenc>
<xenc:EncryptionMethod
Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<wsse:SecurityTokenReference>
<wsse:Reference
URI="#SecurityToken-2bf9dfb3-9f7d-42ac-9bfc-e12919fb2202"
ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/dk" />
</wsse:SecurityTokenReference>
</KeyInfo>
<xenc:CipherData>
<xenc:CipherValue>
Ig7MdF2oZZS625taru1b/RwH5IDePxBUwIWDw
0Lw2Y/E8HetOG64sdpX6J7bZeLXf8XWA3TmyC
gCmqBgQJn/UD73ZlVdAufVv3pzTAeew62GcnH
Esj3AZOYNcDI90wVZUZ4Dm7LMn4T9K6SBJO7qgw==
</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedData>
</soap:Body>
可以看到包体中的明文已经变成了密文CipherValue
从这段代码来看,它的加密方法是AES,256位CBC格式。关于更多对称加密的内容可见:
http://www.cnblogs.com/jams742003/archive/2010/04/07/1706471.html
对于soap消息的加密保护可在策略断言中设置,下面给出一段完整的策略断言:
<policy name="ClientPolicy">
<anonymousForCertificateSecurity
establishSecurityContext="false"
renewExpiredSecurityContext="true"
requireSignatureConfirmation="false"
messageProtectionOrder="SignBeforeEncrypt"
requireDerivedKeys="true" ttlInSeconds="300">
<serviceToken>
<x509 storeLocation="CurrentUser"
storeName="AddressBook"
findValue="CN=soapEncrypt"
findType="FindBySubjectDistinguishedName" />
</serviceToken>
<protection>
<request
signatureOptions="IncludeAddressing,IncludeTimestamp,IncludeSoapBody"
encryptBody="true" />
<response
signatureOptions="IncludeAddressing,IncludeTimestamp,IncludeSoapBody"
encryptBody="false" />
<fault
signatureOptions="IncludeAddressing,IncludeTimestamp,IncludeSoapBody"
encryptBody="false" />
</protection>
</anonymousForCertificateSecurity>
</policy>
策略断言可以使用 turnkey断言或自定义。
turnkey安全断言的作用:
·消息级别或传输级别的安全
·证明客户或服务或两者的安全凭证
·保护soap消息的安全凭证
它有很多种类,下边列举一下:
·<anonymousForCertificateSecurity>
·<kerberosSecurity>
·<mutualCertificate10>
·<mutualCertificate11>
·<usernameOverTransportSecurity>
·<usernameForCertificateSecurity>