簡體   English   中英

REST API令牌認證

[英]REST API token authentication

我剛剛開始開發.NET中的第一個REST API。 由於它將是無狀態的,因此我將使用令牌進行身份驗證:

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

  • AES用於加密+ HMACSHA256用於完整性
  • 令牌數據將由具有以下屬性的對象組成:用戶名,發行日期和超時
  • 數據庫將保存用戶名,哈希密碼和HMAC哈希

登錄:

  • 檢查憑據是否有效(用戶名,將哈希密碼與db值進行比較)
  • 如果為true,則加密數據對象
  • 在生成的令牌上使用HMAC並將其存儲到數據庫
  • 向用戶返回令牌(無HMAC)(cookie /字符串)

對需要身份驗證的方法的請求:

  • 用戶隨每個請求發送令牌
  • 令牌已解密
  • 如果過期,則報錯
  • 如果未過期,請使用HMAC並將用戶名+生成的哈希與db值進行比較
  • 如果數據庫檢查有效,則表明用戶已通過身份驗證

在我看來,這種方法具有以下優點:

  • 即使db被破壞,它也不包含實際的令牌(哈希不能反轉...)
  • 即使攻擊者擁有令牌,他也無法通過更新字段來增加過期時間,因為過期日期在令牌本身中

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

除此之外,我仍然不知道在服務器上的哪個位置存儲AES和SHA256密鑰(我應該對它們進行硬編碼嗎?如果我將它們放入web.config或使用機器密鑰,那么在負載均衡服務器的情況下,我會遇到問題, ...)。

最后,由於Crypto.CreateEncryptor要求使用它進行解密,因此我應該將AES IV向量存儲在哪里? 這是否意味着用戶必須在每個請求中發送令牌+ IV?

我希望這是有道理的,我先感謝您的回答。

更新:

好的,現在我進行了更多研究,並得出了以下解決方案:

  • 令牌將包含原始指定的數據(用戶名,發行日期和超時)
  • 令牌是使用crypto-then-mac生成的(它包括AES加密數據,IV矢量+這兩個用於身份驗證的值的標記,是使用HMACSHA265生成的)
  • 令牌標記將被寫入數據庫
  • 在以下情況下,將對用戶進行身份驗證:
    • 標簽有效(令牌認證)
    • 數據可以解密
    • 令牌尚未過期
    • 標簽與數據庫中寫的標簽匹配
    • 用戶未在數據庫中被阻止(按需令牌無效)
  • 密鑰將存儲在web.config的單獨部分中。 每個服務器上必須有相同的密鑰(當然,每個應用程序都需要)

我沒有使用FormsAuthenticationTicket,因為在.NET中存在以下問題:

這是該問題下的注釋線程的后續操作。

您對於OAuth的確切含義似乎有些困惑,因此希望我可以在這里進行澄清。

OAuth不是Web服務或您使用的東西。 它是一個協議,描述了站點可以針對服務對用戶進行身份驗證的方式,而又不允許站點知道用戶的憑據是什么。 作為附帶的好處,大多數OAuth提供程序還具有Web服務來查詢用戶的信息,並且可以同時授予這樣做的權限。

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

例如,假設您有一個Web服務,允許第三方站點為用戶提供Acme品牌的窗口小部件。 您的第一個第三方實現者是流行的MyBook.org。 流看起來像這樣:

  1. 有人邀請用戶在其MyBook個人資料上使用“ Acme Widgets”應用程序。
  2. 用戶單擊按鈕,該按鈕將重定向到AcmeWidgets.com。 該網址看起來像:

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

  3. 詢問用戶是否要允許MyBook訪問其數據和置備小部件。
  4. 用戶單擊“是”,隨后Acme Widgets指出該用戶已允許它。
  5. 用戶將通過以下URL重定向回MyBook:

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

  6. 服務器端的MyBook現在獲取該令牌,並將Web服務調用BACK放置到AcmeWidgets:

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

  7. AcmeWidgets會以最終身份驗證令牌進行答復,以標識用戶。
  8. 或者,它失敗,這意味着用戶正在嘗試偽造令牌,或者他們拒絕了許可或某些其他失敗情況。
  9. 帶有令牌的MyBook現在可以調用AcmeWidgets API:

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

這就是眾所周知的OAuth舞蹈。 請注意,這里有許多實現定義的內容,例如URL,各種令牌的編碼方式,令牌是否可以過期或被撤銷等。

希望這可以為您清除一切!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM