最近作個項目,biztalk跟OTM(Oracle Transportation Management)系統作對接,雙方經過web services通信,這部分是BizTalk發佈WS-Security的web services,使用WS-Security的Username Token驗證方式。java
因此須要使用UsernameToken Web Service Security Policy,並使用HTTPS加密此SOAP消息的傳輸。web
這樣的web services是能夠跟被java客戶端調用的。數據庫
https的請求內容格式以下:c#
POST https://URL HTTP/1.1 windows
Content-Type: text/xml; charset=utf-8 測試
SOAPAction: "process" 加密
Host: host spa
Content-Length: 6115 3d
Expect: 100-continue xml
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<env:Header>
<ns1:Security>
<ns1:UsernameToken>
<ns1:Username>GUEST.ADMIN</ns1:Username>
<ns1:Password>CHANGEME</ns1:Password>
</ns1:UsernameToken>
</ns1:Security>
</env:Header>
<env:Body>
...your message content goes here...
</env:Body>
</env:Envelope>
爲測試目的,新建一個簡單的用於發佈爲web servicdes的schema:
爲測試目的,新建一個簡單的接收前面新建的schema的request,簡單映射爲response的消息直接返回:
部署這個BizTalk project,而後使用BizTalk WCF Services Publishing Wizard把orchestration的接收端口發佈爲WCF。
要發佈使用WS-Security的web servicdes必須使用WCF-CustomIsolate的Transport type,下一步:
選擇"Publish BizTalk orchestration as WCF Service",下一步:
選擇前面創建的BizTalk project的dll,下一步:
這裏顯示了選擇的dll中包含的orchestration和orchestration包含的能夠發佈爲WCF的接收端口,下一步:
設置發佈的WCF的Target namespace,下一步:
這是指定要發佈到IIS的路徑,同時選擇"Allow anonymous access to WCF servicde",容許IIS中匿名訪問web services,由於用戶的身份驗證是在消息內的。
發佈完成後,在BizTalk的Application中會生成一個WCF-CustomIsolate的接收端口:
發佈的WCF-CustomIsolate的接收位置在IIS中生成的Application的Application Pool默認使用DefaultAppPool,這個Application Pool的Identity是Windows內建的ApplicationPoolIdentity帳號,不具備訪問BizTalk數據庫的權限,因此須要將Application Pool改成具備訪問BizTalk數據庫的權限Identity的Application Pool。
不然訪問發佈的WCF會出現這樣的提示:
查看WCF-CustomIsolate的屬性:
點擊"Configure…":
修改這裏的Binding。
增長security Extension,並把它移動到最頂層的位置,並把authenticationMode設置爲UserNameOverTransport:
將textMessageEncoding的messageVersion設置爲"Soap11":
刪除httpTransport Extension,增長httpsTransport,由於須要使用TLS進行消息的加密傳輸:
在Behavior標籤下,增長serviceCredentials的serviceBehaviors:
確認在UserNameAuthentication下的userNamePasswordValidationMode設置爲Windows,表示驗證客戶端的UsernameToken將使用Windows的用戶驗證,即客戶端的UsernameToken將跟windows的用戶進行比對,若是windows的用戶有跟客戶端的UsernameToken匹配的即驗證成功。
能夠新建一個簡單的c# console應用做爲客戶端調用發佈的WCF,而後用Fiddler抓取通信的數據格式,判斷髮布的WCF是否符合WS-Security。
在c# console應用中引用前面發佈的WCF:
具體調用WCF的代碼以下:
其中的chnking是windows的用戶,Jjz123356是這個windows用戶的密碼。
執行這段代碼執行調用WCF的過程,使用Fiddler抓取數據查看請求消息格式爲:
能夠看到這個請求調用web services的消息格式徹底符合WS-Security的格式。
再看,返回的消息格式:
能夠看到,服務端返回的正常的結果。