2012-03-06 36 views
1

我有一個使用WCF實現的REST端點。所有來回數據都使用SSL加密。我正在開發一個Web前端(僅使用純HTML和Javascript)來公開服務的功能。但是,我對如何處理身份驗證有點困惑。保護其餘端點

根據Fielding 5.1.3:「...這樣每個來自客戶端的請求都必須包含理解請求所需的全部信息,並且不能利用服務器上存儲的任何上下文。因此完全依靠客戶。「

當然,我想爲應用程序提供一個登錄頁面,允許用戶輸入他們的憑據,然後REST服務將「驗證」它們並確保它們是有效的。但是,如果我保持REST服務無狀態,那麼我在哪裏將身份驗證信息存儲在客戶端?我已經研究過OAuth 1.0和2.0草案等解決方案,但似乎並不是我所需要的。

主要是,我的問題是,如果用戶「認證成功」,我怎麼能保持這種狀態在客戶端?

下面是數據流:

用戶查看登錄頁面---> 瀏覽器提交AJAX請求休息服務和回覆等待---> 服務器返回有效---> 的REST服務現在已解鎖並準備用於當前登錄的用戶範圍內的當前「會話」。

回答

1

我處於類似的情況,並使用OAuth 2.0。我有幾個域,分別是管理帳戶,開發者,API和應用程序。我允許其他第三方使用REST API。 dotnetopenauth 4相當簡單。

REST服務器本身沒有維護狀態。任何Web應用程序都會從​​帳戶網站請求「令牌」,然後使用openid 2.0對用戶進行身份驗證。每個呼叫都會驗證REST服務器的「令牌」。狀態由Web應用程序維護,因爲令牌存儲在數據庫(持久性)和會話(用於高速緩存)中。這非常適合從其他應用程序中冒充用戶,而不必嚮應用程序泄露任何「祕密」。該協議處理令牌的到期和撤銷。該應用程序充當瀏覽器請求的代理,包括AJAX。這在安全性方面簡化了客戶端上的JavaScript。

另一種方法是使用亞馬遜方式在其中使用REST服務所具有的祕密簽署請求。對於每個請求,您執行完全相同的算法來簽署請求,如果相同,則您知道該請求是合法的。雖然這比OAuth 2.0更簡單,但您需要制定自己的方案來處理被撤銷的祕密。

+0

聽起來像一個計劃...謝謝! – 2012-03-07 20:12:19

1

當用戶成功登錄時,應該生成一個身份驗證令牌並將其保存在用戶的cookie。該身份驗證令牌在數據庫中映射到用戶的用戶名。

隨着用戶發送到其餘服務的每個請求,從cookie中獲取該標記並將其發送到標頭或請求正文中。該服務將查找該令牌並將其與用戶名相匹配。

您可以使用The Microsoft Enterprise Library Security Application Block來生成令牌。

1

我看到的最簡單的解決方案是將您的登錄憑據放入加密的cookie中。我已經看到了一些關於cookies是否可以成爲RESTful服務的一部分的爭論,並且我可以理解cookies不屬於REST的論點,但這當然是使用cookie的最RESTful方式。除此之外,我能看到的最簡單的解決方案就是在每次調用時傳入某種登錄哈希(並且可能返回)。