2012-12-14 92 views
3

我正在建立一個新的ASP.NET Web API應用程序使用直HTML5和Web Api寧靜服務。我已經在使用表單身份驗證和[Authorize]屬性來保護我的web api調用。我儘可能保持真實,以遵守寧靜的原則。寧靜的Web API中的雙因素身份驗證

我在模仿使用雙因素身份驗證並使用asp.net web表單的現有應用程序。雙因素身份驗證不用於登錄,但用於通過站點和插件遠程登錄到另一臺計算機的其他任務。

現有的Web應用程序使用會話狀態來存儲生成並通過電子郵件發送給用戶的引腳。然後,當用戶進入引腳時,它將在會話狀態下針對引腳進行檢查。

所以它看起來像我的選擇是......

  1. 加密針在服務器上生成併發送回客戶端 在JavaScript中。這個選項看起來像是一個安全風險。這將是更加寧靜的選擇。
  2. 一位同事建議使用類似Amazon S3使用公鑰/私鑰對的內容。
  3. 使用會話狀態,儘管使用web api。

那麼這些選項中哪些是最佳選擇?還有其他的可能嗎?

+0

看看這篇文章[http://stackoverflow.com/questions/12586147/why-both-a-key-and-a-secret-in-many-web-apis/12587910#12587910]有幫助。 – basiljames

回答

1

我不是100%確定我理解你的架構,但似乎非常相關的是,你的安全應該不會依賴於客戶端。

假設用戶在他們的瀏覽器中有一個javascript調試器(大多數人實際上並沒有意識到這一點)以及您的插件的自定義構建。

因此,輔助PIN碼挑戰應該嵌入到服務器端,以「遠程處理」協議。 如果是基於RDP或VNC的應用程序,應該可以將給定用戶的連接密碼快速更改爲一次性生成的PIN。

0

我相信,你不應該過分關注RESTful原則(等等,我是這麼說的嗎?:))......你看,一方面是理論,另一方面是實踐。在實踐中,您經常需要破解RESTful安全原則!讓我們看看nonce - 這是一個爲每個請求生成的大隨機數,如果以前沒有發送過相同的nonce,則會隨後在服務器上進行檢查。這涉及存儲狀態(隨機數) - 即它不是無狀態的,但它對於安全性有時是至關重要的。另外,順便說一句,經常使用的OAuth不是RESTful。

對於加密PIN碼,您不應該使用JavaScript客戶端!您可以實現某種加密的端點上使用JavaScript客戶端領域,雖然:

  1. 使用XMLHTTPRequest生成請求到端點URL(例如,/api/encrypt)。
  2. 服務器獲取此請求並加密服務器上的PIN,即PIN不會以明文狀態進入瀏覽器。
  3. 服務器將加密的PIN返回給JavaScript客戶端。
  4. 客戶端將加密的PIN碼發送給客戶。

你的同事給了一個很好的建議!亞馬遜是最好的REST API實現之一。

同時檢查我的想法: https://stackoverflow.com/questions/15418764/looking-for-feedback-on-my-rest-style-api-authentication-design-and-two-factor-a