2011-03-23 81 views
4

我調查創造一個現有的asp.net應用程序一個WCF REST服務,通過各種客戶端,包括Windows Phone 7的,Android設備,iPhone應用程序等會員/授權通過REST服務

創建一個簡單的消耗WCF REST服務和從上述平臺上使用它不是問題,並且工作得很好。我正在努力爭取我的頭腦是授權。

該asp.net應用程序使用成員資格提供程序來提供身份驗證和授權,我很樂意從REST服務使用該API。

如何保護我的REST服務,以便第一次調用必須進行身份驗證(傳遞用戶名和密碼),並且以下調用知道誰已登錄。我猜測認證方法將不得不傳回某種令牌,以便在隨後的調用中識別調用者。這是否足夠安全,因爲整個站點/服務都通過SSL?

歡迎任何建議。

回答

2

一般來說,令牌方式比每個請求只發送用戶名+密碼(基本認證)更好。問題是要正確實現:雖然Basic Authentication很容易實現,而實際上它已經被大多數應用程序和Web服務器實現,但令牌是您需要實現的東西 - 它必須被加密,因此客戶端贏得了'不瞭解它,所以你需要一些密鑰管理,它也必須有一些到期日期,可能你會想要一些撤銷功能。另外,它會讓客戶的生活變得更加困難:客戶端不必爲每個請求附加基本的驗證頭,而必須先到某個驗證點,接收一個有效的請求,然後在請求中使用該令牌。如果令牌過期,則客戶端需要再次轉到認證點。

所以如果你有時間和知識,而你的客戶很聰明,最好使用令牌方法。否則,使用SSL,基本認證應該足夠了。

+0

我認爲我更喜歡令牌方法,而不是在每個請求上發送用戶名和密碼。我知道這不是嚴格的RESTful,因爲我將不得不維持狀態,但在這種情況下,我很樂意接受這種狀態。 – DavidGouge 2011-03-24 23:03:02

+0

我看不出爲什麼你說這個令牌(即,如果我瞭解你,在cookie中的會話ID)更好。它使你的應用程序有狀態,這是絕對不安寧的,讓客戶的生活更難,不是更安全(比較會話劫持),讓服務器的生活變得更難(負載平衡在狀態滿的應用程序中要困難得多)......你能詳細說明你爲什麼認爲它更好? – 2011-03-25 06:59:34

+1

其實我並不是故意將會話ID放入cookie中,而是在頭中加入一些加密的令牌。這不會改變REST的無狀態特性。因爲你不需要在每個請求中發送密碼,所以它會降低密碼被盜的可能性。它也允許SSO場景:用戶已登錄到需要調用REST調用的應用程序,因此應用程序使用加密的令牌而不是密碼。實際上登錄後從未使用密碼。 – Tarlog 2011-03-25 09:25:12

4

更平靜的認證方案是使用HTTP認證,例如,基本或摘要。由於您的服務已通過SSL,因此Basic應該足夠了。驗證令牌(登錄/密碼)隨每個請求一起發送,以便服務可以是無狀態的。我知道的每個客戶端庫都可以處理基本身份驗證。

+0

謝謝你的回答。 :) – DavidGouge 2011-03-24 23:03:19

0

我見過最新的WP7 Windows Azure工具包中的一個例子,可能對您有所幫助。它基本上使用成員資格提供程序,登錄一個人(第一次安裝應用程序),然後生成一個工單。然後加密這張票並將其作爲一個TOKEN發回,然後將其存儲在隔離存儲器的手機中。票證的過期設置爲int.MaxValue,以便令牌在很長一段時間內保持良好狀態。

現在,這個令牌被傳遞到Authorization Header中的Web Services,在那裏它被解密,用戶的身份被驗證,然後進行Web服務調用。

希望這有助於。我試圖解決一個類似的情況,相信我,沒有太多的東西指向正確的方向......如果你問我,這是一件相當悲傷的事情。