2011-08-26 444 views
7

我在asp.net mvc中構建了一個REST API。我的系統使用表單認證。用戶名/密碼或openId/fbconnect等。如果我在動作上擁有[Authorize]屬性,那麼Android應用或桌面應用如何訪問該方法?使用REST API進行身份驗證

或者更好的問題是,我將如何設計桌面應用程序進行身份驗證?我需要傳遞一個API密鑰還是某種類型的令牌?或者,桌面應用程序的行爲如同瀏覽器並使用內部cookie?我不太確定RESTful API如何在具有認證的Web瀏覽器之外工作。

回答

14

我不會在REST API中使用cookie。 FormsAuthentication是一個基於cookie的方法。相反,調用者應該爲頭中的每個請求提供認證憑證,或者作爲請求參數。例如,您可以使用基本身份驗證來傳輸用戶名和密碼,或者添加帶有一些加密訪問令牌(這不是非常RESTful)的自定義身份驗證頭。您也可以實施OAuth,其中請求者將爲每個請求提供一個訪問令牌。

我會寫一個自定義的AuthorizeAttribute在您的代碼中執行身份驗證,這會給您很多控制權。或者,您可以使用控制器基類並覆蓋OnAuthorization方法。

API不應提供密碼挑戰:在Web應用程序中,未經授權的請求通常會將用戶重定向到登錄頁面。在API中,請求只會返回錯誤代碼。現在,客戶端應用程序的工作是通過對話框來挑戰用戶(如果適用)。在移動應用中,您可能想要顯示對話框。在使用OAuth的Web應用程序中,您可能需要重定向到身份驗證服務器。

如果你想測試你的REST API,我建議你使用REST Console for Google ChromecURL。前者對初學者來說更簡單,並帶有一個漂亮的GUI,而cURL則爲您提供更多保真度和多種協議。

編輯

一個有點迂腐注:某些API,即使是那些相當大的供應商,例如Twitter,不時返回401狀態代碼,通常省略(強制性)WWW-Authenticate標題,因爲它不是要向客戶挑戰。

+0

對於Chrome瀏覽器的REST控制檯+1,提及:)好的! –

+1

'我不會在REST API中使用cookie' - 同意,但是,您可以使用它來生成一個安全的令牌,就像[這個答案]一樣(http://stackoverflow.com/questions/840537/generating-cryptographically-安全認證的令牌#858724)。 – James

+0

@詹姆斯:這是一個很好的觀點。使用一個令牌肯定會更好,而不是一直髮送用戶名和密碼,因爲這樣更容易隔離樣板代碼。 – mnemosyn

1

查看亞馬遜AWS認證方案。它可以滿足大多數人的需求,它使用標準的HTTP授權標頭。