2011-08-05 44 views
4

我試圖將此轉換WSE3.0代碼WCF:當使用UserNameOverTransport綁定時,如何讓WCF以摘要模式發送密碼? (轉換WSE3.0代碼WCF)

// we use Microsoft WSE 3.0 to insert the username token in the soap header. 
// This strategy takes care of creating and inserting the Nonce and Created elements 
// for us, as well as creating a password digest based on Nonce, Created, and 
// the password itself. Refer to the WS-Secutiry UsernameToken Profile 1.1 
// specification at http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wss. 

Microsoft.Web.Services3.Security.Tokens.UsernameToken nametoken; 
nametoken = new Microsoft.Web.Services3.Security.Tokens.UsernameToken(username, password, Microsoft.Web.Services3.Security.Tokens.PasswordOption.SendHashed); 
Microsoft.Web.Services3.Design.Policy ClientPolicy = new Microsoft.Web.Services3.Design.Policy(); 

ClientPolicy.Assertions.Add(new UsernameOverTransportAssertion()); 
this._proxy.SetPolicy(ClientPolicy); 
this._proxy.SetClientCredential<UsernameToken>(nametoken); 

我已經得到了,除了在上面摘要模式發送密碼(Microsoft.Web.Services3.Security.Tokens.PasswordOption.SendHashed八九不離十代碼'):

TransportSecurityBindingElement transportBindingElement = 
    SecurityBindingElement.CreateUserNameOverTransportBindingElement(); 
transportBindingElement.AllowInsecureTransport = true; 
transportBindingElement.EnableUnsecuredResponse = true; 
transportBindingElement.IncludeTimestamp = true; 
var binding = new CustomBinding(new BindingElement[] { // 
    transportBindingElement, // 
    new TextMessageEncodingBindingElement() { 
     MessageVersion = MessageVersion.Soap11 
    }, // 
    new HttpTransportBindingElement() { 
     AuthenticationScheme = AuthenticationSchemes.Digest, 
    }, // 
}); 

上面還是以純文本形式發送密碼(unhashhed)。我發現這個link有人試圖將類似的代碼轉換爲某人,指出無需設置WCF就可以在不編寫自定義令牌串行器的情況下執行此操作。

這句話是否準確?

如果是這樣,我需要做什麼來創建和使用此自定義序列化程序?

它看起來像這樣link時從網站linked中,讓下面的公式Password_Digest = Base64 (SHA-1 (nonce + created + password))註釋的PDF合併,但可能是一個很好的起點,如果有人有什麼我需要以及如何得到更好的解釋讓WCF使用我的新序列化程序,我很樂意聽到它。

+1

在[Codeproject](http://www.codeproject.com/KB/WCF/DigestAuthWCFRest.aspx)上有一篇很好的文章 –

+0

看起來像一篇有用的文章,謝謝。到目前爲止,我只是剔除它,但肯定會用它作爲工作中的參考。 –

回答

4

您發現我的問題:)

這是非常有趣的問題。 MS經常被指責爲他們生產不安全的系統和API,並且MS中的一些工程師正在合併關於什麼是安全和什麼不適用於新API的一些想法。帶有消化密碼的UserNameToken配置文件正是這種努力的結果。它被認爲不夠安全,因爲它完全從WCF中省略。那麼,如果WCF不會成爲一個與其他平臺和框架互操作的API,那麼UserNameToken配置文件與消化密碼非常受歡迎。

是的,我們在解決問題時做了自定義令牌串行器。它不僅關於令牌串行器。你實際上必須實施相當多的課程才能實現它。我不會分享我們的實施,因爲它不是我的代碼,但你可以試試this one

+0

感謝評論和一個實現的鏈接。我還沒有機會嘗試編碼,但是當我這樣做時,我一定會回報。 +1直到然後希望更多來。 –

+0

從你實施的代碼鏈接到工作很好。對於將來的讀者,代碼中的示例客戶端具有設置綁定並交換客戶端憑證的所有信息。儘管在示例代碼中我確實發現了一兩個奇怪的行爲,所以請確保您閱讀完它。例如,UsernameToken.GetPasswordDigestAsBase64()會覆蓋您在構造函數中配置的所有「nonce」,而不是使用提供的值(修復此問題是允許單元測試確保爲已知輸入返回期望摘要所必需的)。 –