2013-03-10 126 views
10

我剛剛開始在.NET中開發我的第一個REST API。因爲它是無狀態的,我將使用令牌認證:REST API令牌認證

基本思路(System.Security.Cryptography):

  • AES加密+ HMACSHA256完整性
  • 令牌數據將包括與對象屬性:用戶名,發佈日期和超時
  • 數據庫將持有的用戶名,哈希密碼和HMAC哈希

登錄:

  • 如果檢查證書是否有效(用戶名,比較散列密碼,以dB值)
  • 如果屬實,加密數據對象
  • 使用HMAC上生成的令牌,並將其存儲到數據庫
  • 返回令牌(不HMAC)到用戶(餅乾/串)

請求方法,該方法要求身份驗證:

  • 用戶發送令牌與每個請求
  • 令牌進行解密
  • 如果它已過期,錯誤
  • 如果沒有過期使用HMAC,並比較用戶名+用分貝產生的散列值
  • 如果分貝檢查有效,用戶驗證

我看到它的方式,這種方法有以下優點:

  • 即使DB是comprosmised,它不包含實際令牌(哈希不能顛倒...)
  • 即使攻擊者擁有的道理,他無法通過更新字段,因爲截止日期是在增加到期代幣本身

現在首先,我想知道這是否是一種好方法。

除此之外,我仍然沒有弄清楚,在服務器上存儲AES和SHA256密鑰的位置(我應該只是硬編碼它們嗎?如果我把它們放入web.config或使用機器密鑰比我遇到問題負載平衡的服務器......)。

最後,我在哪裏存儲AES IV向量,因爲Crypto.CreateEncryptor需要它來解密?這是否意味着用戶必須向每個請求發送令牌+ IV?

我希望這是有道理的,我提前感謝您的答覆。

UPDATE:

好了,現在我做了一些調查研究,並來到了該解決方案:

  • 令牌將包含原先指定的數據(用戶名,發放和超時的日期)
  • 令牌生成與encrypt-then-mac(它包括AES加密數據,IV矢量+標籤這2個值用於驗證,用HMACSHA265生成)
  • 令牌標記將生成如果被寫入到數據庫
  • 用戶將進行身份驗證:
    • 標記有效(令牌認證)
    • 數據可以被解密
    • 令牌尚未到期
    • 標籤相匹配的寫入數據庫
    • 用戶沒有被阻塞在數據庫(按需令牌無效)
  • 鍵將被存儲的I ñweb.config單獨的部分。相同的密鑰將因爲.NET有以下幾個問題要在每個服務器上(每個應用程序當然)

我沒有使用的FormsAuthenticationTicket:

+0

我很好奇,爲什麼將數據存儲在令牌中?如果你必須對數據庫進行驗證,那麼爲什麼不把數據存儲在數據庫中,只需使用Guid或其他隨機令牌? – 2013-03-18 12:45:54

+1

由於令牌過期日期 - 我想確保它不能在數據庫中更新+如果過期無效,您不必進行數據庫查詢。 – 2013-03-18 12:52:07

+1

您應該查看OAuth(http://oauth.net/),因爲這基本上就是您在這裏描述的內容。 – 2013-03-18 14:30:11

回答

7

這是來自問題下的評論主題的跟進。

對於OAuth的確切含義,您似乎有點困惑,所以希望我能在此澄清一下。

OAuth不是Web服務或您使用的東西。它是一種協議,描述了網站可以根據服務對用戶進行身份驗證的方式,而不允許網站知道用戶的憑據。作爲一個附帶的好處,大多數OAuth提供者也有一個Web服務來查詢用戶的信息,並且同時允許這樣做。

通常,您有興趣從網站的角度實施OAuth(例如,AcmeWidgets.com),以便用戶可以通過Facebook或Google等登錄。但是,您也可以實現服務端(例如,Facebook通常的位置),並允許其他人對您進行身份驗證。

例如,假設您有一個Web服務以允許第三方網站爲用戶配置Acme品牌Widgets。您的第一個第三方實現者是流行的MyBook.org。流程如下所示:

  1. 有人邀請用戶在他們的MyBook個人資料上使用「Acme Widgets」應用程序。
  2. 用戶單擊按鈕,該按鈕重定向到AcmeWidgets.com。該URL類似於:

    http://acmewidgets.com/oauth/user?r=http%3A%2F%2Fmybook.org%2Foauth%2Fclient&appid=12345

  3. ,如果他們希望允許MyBook訪問他們的數據和提供部件詢問用戶。
  4. 用戶點擊是,Acme Widgets注意到用戶允許它。
  5. 用戶被重定向回MyBook,在URL這樣的:

    http://mybook.org/oauth/client?token=ABCDEFG

  6. MyBook,在服務器端,現在需要令牌,BACK放置一個Web服務調用AcmeWidgets:

    http://acmewidgets.com/oauth/validate?token=ABCDEFG&appid=12345&appsecret=67890

  7. AcmeWidgets回覆與最終認證令牌識別用戶。
  8. 或者,它失敗,這意味着用戶試圖僞造一個令牌,或者他們拒絕許可或其他故障條件。
  9. MyBook,與令牌,現在可以調用的API AcmeWidgets:

    http://acmewidgets.com/api/provision?appid=12345&token=ABC123&type=etc

這一切被稱爲OAuth技巧。請注意,此處有許多實現定義的內容,例如URL,各種令牌的編碼方式,令牌是否可以過期或被撤銷等。

希望能夠爲您清除所有內容!

+0

謝謝,非常好的解釋 – 2013-03-18 21:24:18

+0

在網絡中的第一個地方,我發現OAuth協議清楚而簡短地描述! – 2015-05-21 09:42:40