2011-05-16 43 views

回答

4

愛德華多,你問:@carlosfigueira:我可以用它來實現認證子系統嗎?

我正在研究同一個問題,並且至少爲您和即將推出的基於授權標頭的解決方案(如下所述)提供解決方案(我相信您正在考慮「攔截」)。

,以確保基於模型REST WebHttp編程WCF 4端點最簡單的方法是這樣的:

  1. 問題一個共享密鑰和API密鑰給每一個客戶作爲憑證使用。 API密鑰與用戶名真正相同。
  2. 通過SSL運行所有端點以確保您始終具有通道/消息/數據安全性
  3. 要求客戶端使用共享密鑰來生成包含時間戳記及其API的HMAC-SHA1(或equiv)散列簽名字符串鍵。
  4. 要求客戶端傳遞的這些所有3作爲查詢字符串參數在每個請求中
  5. 在你的服務端,實現認證方法,它的所有3個字符串,然後:
    • 查找該API密鑰,並返回客戶端的共享祕密,有一個DB或其他地方。
    • 將時間戳與DateTime.Now進行比較以確保請求不超過15分鐘以抵禦重播攻擊。
    • 使用這3個字符串,重新創建簽名字符串並將其與客戶端傳入的字符串進行比較。
    • 如果它們匹配,請求者是真實的。現在

,更好的方式來做到這一點是通過使用HTTP授權請求報頭存儲的3串,並有一個全球性的攔截十歲上下的過程看所有請求。這將防止沒有身份驗證塊的暴露端點的可能性(至少,其可能性較低)。

使用查詢字符串來傳遞所有這些信息的問題是查詢字符串的最大長度爲2k(因客戶端/瀏覽器而異),並且查詢字符串在調試時非常難以讀取......但只是得到使用到它。

有人認爲更復雜的方法是STS模型,您需要客戶端將這3個身份驗證字符串傳遞給安全令牌服務端點。響應消息會傳回一個會話令牌,客戶端會在每個呼叫中​​傳遞一個會話令牌來代替3個字符串。確實,對於客戶端而言,在每次調用時都不需要生成HMAC哈希簽名,但服務器端仍必須對令牌進行身份驗證,並且會話概念會導致乾淨的RESTful無狀態行爲。

我會盡我所能發佈實現查詢字符串和auth頭文件方法的代碼塊。

7

我回來了一個更新。

我碰巧重視代碼的簡單性,並且在成功解決了這個問題後,我不能說我比查詢字符串方法更喜歡它。將一次調用放入每個調用AuthN方法並與AuthZ方法並行的服務端點似乎比一些人認爲的更容易。

無論如何,足夠的意見......對解決方案。該解決方案是正確的在我們的#2的眼睛在這個環節,但於我們而言不是很好的描述......所以我會給予信貸「user634119」示例代碼這裏找到: Headers in OperationContext

首先,我們需要添加一個serviceBehavior我們的web.config文件:

<behaviors> 
    <serviceBehaviors> 
    <behavior> 
     <serviceAuthenticationManager serviceAuthenticationManagerType="WCF.BasicAuthorization, WCF"></serviceAuthenticationManager> 
     <serviceAuthorization impersonateCallerForAllOperations="false" principalPermissionMode="Custom" serviceAuthorizationManagerType="WCF.BasicAuthentication, WCF"> 
     </serviceAuthorization> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

下使一個類(稱爲BasicAuthorization如serviceBehaviors引用上述塊):

//Authorize the call against the URI resource being requested... 
public class BasicAuthorization : ServiceAuthorizationManager 
{ 
    public override bool CheckAccess(OperationContext operationContext, 
    ref Message message) 
    { 
     //some code 
    } 
} 

下使身份驗證類:

// Authenticate the header signature as described in my previous post 
public class BasicAuthentication : ServiceAuthenticationManager 
{ 
    public override ReadOnlyCollection<IAuthorizationPolicy> Authenticate(
     ReadOnlyCollection<IAuthorizationPolicy> authPolicy, Uri listenUri, 
     ref Message message) 
    { 
     //some code 
    } 
} 

在驗證方法,使用HttpRequestMessageProperty拉動請求頭細節出並執行在我的第一應答描述的相同的3個步驟。

+0

我一直在閱讀/關注如何保護用WCF 4.0實現的基於REST的服務。沒有一個提供了一個簡單的解決方案。但是這似乎是實現身份驗證和授權的最優雅的解決方案。 – 2013-10-09 14:45:56

相關問題