wse說談(2)——策略,匿名使用者策略

廳一一發表於2010-04-23

wse檢視工具中,其中的兩個選項卡:策略(Policy)和安全(Secury

1 策略是對安全的控制

2 安全選項卡中可以設定對於安全控制的策略元件的設定,例如使用者令牌管理,證書管理

 

策略分兩種,服務端和客戶端。在新增策略檔案時,驗證項(使用者的授權)可以有四種選擇:

Anonymous(匿名使用者):這種型別不要求有客戶憑證

Username(使用者):這種型別要求客戶端傳遞一個使用者令牌憑證,憑證中包含使用者名稱和使用者密碼

Certifacate(證書):這種型別要求客戶端傳遞一個證書令牌,令牌中包含x.509證書

Windowswindows):這種型別要求客戶傳遞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>

 

(一)不啟用策略

不啟用策略時,就是不配置WSEPolicy部分。只是對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

從這段程式碼來看,它的加密方法是AES256CBC格式。關於更多對稱加密的內容可見:

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>

部落格園大道至簡

http://www.cnblogs.com/jams742003/

轉載請註明:部落格園


相關文章