2013-09-25 193 views
1

RESTful服務的新手,但在主題上閱讀了很多。在VS2010中實現C#Restful登錄 - 正確實施

類似(幾乎相同)的問題已經在stackoverflow上被詢問和回答,但老實說,我沒有從響應中學到任何東西。

我想實現一個AuthenticatUser調用,其中發送用戶名和密碼並返回一個驗證密鑰。

鑑於這需要使用GET,POST,PUT或DELETE來完成,看起來GET最合適。

所以也許能使MYDOMAIN /爲MyService /認證/ {名}/{}密碼

,因爲用戶名和密碼的URI傳遞我不喜歡這個,但據我所知它是不是一個好在GET中發送主體的想法。所以POST或者PUT可以工作,但是這似乎與RESTFul哲學不同。

問題1:可以在URL中發送密碼等敏感數據嗎?該網站將使用SSL。

問題2:在傳遞多個參數時,看起來URI概念會變得有點瘋狂,複雜查詢應該如何被RESTfully處理?

問題3:在RESTful API中,首選(正常,最常見)的身份驗證方法是什麼?

+0

我認爲你需要閱讀什麼是「RESTful」,它會誠實地回答你的大部分問題。除此之外,URL在瀏覽器中是可讀的,因此在URL中放置任何機密信息都是不明智的。 –

+1

通常,您的身份驗證方案將涉及*創建會話對象(通常位於服務器上的數據庫中),因此使用用戶證書的PUT或POST完全適合。 – JDB

+0

有意思的是創建一個服務器端會話對象的POST,但它似乎以技術性擊敗了體系結構的精神。就閱讀而言,我有 - 它仍然凝膠化,我甚至讀過菲爾丁博士的論文。我使用了亞馬遜的S3,我瞭解它是REST,但是在購買時我們會分配一個驗證密鑰,並且它用於請求服務。 – kpg

回答

1

在url中傳遞密碼是不正確的。我對此做了一些研究。首先,如果可能的話,您應該使用SSL上的基本身份驗證。在驗證頭中傳遞用戶名和密碼。現在就休息而言,該會話不在服務器中維護。所以你需要爲每個呼叫傳遞用戶ID和密碼。將密碼存儲在本地存儲中是有風險的。因此,使用POST呼叫進行首次認證並傳遞用戶名和密碼。然後,在成功認證返回時,服務器返回一個tokenkey和tokenvalue。 tokenkey和tokenvalue最初與Amazon私鑰共享類似。從下一個請求開始,發送令牌密鑰並使用令牌值簽署您的數據。每次傳遞令牌密鑰和簽名。在服務器上,服務器驗證簽名,因爲它有一個令牌值副本。如果可能的話,tokenkey和tokenvalue可以存儲在本地。您不能永遠使用tokenkey和tokenvalue。因此,在每個請求中,服務器發送一個隨機數作爲響應。該隨機數存儲在服務器端的數據庫中,並針對每個請求進行更改。當您向服務器發送包含此隨機數的請求時。隨機數使用時間戳形成。如果在15分鐘後發送請求,那麼該隨機數將被解密,並且發現時間戳超過15分鐘,因此您將其重定向到登錄頁面。 Nonce的形成在http://www.ietf.org/rfc/rfc2617.txt中給出。一旦nonce被成功驗證,這個nonce被丟棄,並且現在發送一個新的nonce(用最新的時間戳再次形成)。這也有助於防止重放攻擊。