2011-05-16 215 views
17

我開始相信我是一個非常無能的程序員。經過大量閱讀,我仍然無法弄清楚如何幹淨地實現RESTful WCF服務的認證機制。WCF,REST風格的Web服務和自定義認證

我已經嘗試了一切:

  1. this guide,才發現,所提出的認證機制是一個醜陋的黑客。

  2. 安裝the WCF REST Starter Kit,只是發現它已經過時並已被替換爲另一個項目模板。

  3. 安裝said project template,只是發現它並沒有提供任何自己的認證機制。

  4. 安裝an IIS module that provides custom authentication functionality at transport level, 只有找出作者提供的零文檔。只是爲了找出我需要實現一個MembershipProvider。 (我想僅提供UserNamePasswordValidator

是否有實施一個RESTful WCF服務的身份驗證機制,任何理智的方法是什麼?

+3

我經歷了完全相同的路徑。在處理資源問題時也遇到了類似的問題,並且明顯認識到WCF就是這樣,在REST思維模式下表現不佳。你可以做到,但感覺很不好。我認爲WCF團隊知道這一點,他們正試圖解決它(http://wcf.codeplex.com/wikipage?title=WCF%20HTTP)。無論如何,期待有人在這裏回答,我可以使用它。我們爲它編寫了自己的HTTP模塊,但不是理智的海事組織,所以沒有答案。 – ale 2011-05-16 18:45:05

回答

10

當我調查如何爲自己的WCF RESTful服務實現安全性時,我花了一些時間來研究像flickr和amazon等其他流行服務如何實現自己的安全性 - 假設他們可能花了更多時間考慮它比我有。 Flickr的documentation尤其有助於塑造我的簽名和請求。

最後我爲我的服務選擇了一個HMAC(基於哈希的消息認證碼)認證方案。

我創建了一個自定義的HMAC ServiceAuthorizationManager一個驗證,因爲它涉及的每個請求的簽名中的每個請求包含以下內容:

  • 令牌的用戶
  • 時間戳
  • 現時
  • 簽名

使用此信息,管理員可以從他們的用戶的祕密中查找用戶的祕密令牌,並可以使用提供的信息在服務器上重新創建簽名。

我的簽名包括以下(以特定的順序值進行了排列在一起,並且散列因此該值可以在服務器上重複)的MD5哈希:

  • apikey
  • userToken
  • 祕密
  • 時間戳
  • 現時

爲了快速檢查任何重放攻擊,我將短時間存儲在memcache實例中一段時間​​。在那段時間之後(大約10分鐘),時間戳用於拒絕任何其他舊請求。

我可以張貼我的代碼的一些片段,如果它會幫助。總的來說,我發現HMAC身份驗證通常是最安全的方式,並且可以輕鬆支持任何將使用您的服務的客戶端(而不僅僅是.NET)。

+1

你能否在你的代碼片段中發佈一些信息?這將是非常有益的。或通過電子郵件發送給kral.konf(at)volny.cz。謝謝! – 2011-12-30 16:09:51

+0

你有這種方法的示例代碼嗎? – Mike 2013-02-14 22:04:46

+0

不幸的是,我目前無法訪問該源代碼,但如果我得到一個片刻,我會看看是否可以複製另一個副本(我知道當我編寫原始響應時應該將其包含在內)。 – efalconer 2013-02-28 15:39:34