4

我必須實現一個網站(MVC4/Single Page Application + knockout + Web.API),我一直在閱讀大量的文章和論壇,但是我仍然無法弄清楚安全/認證中的一些問題,確保登錄頁面和Web.API安全的前進方式。我應該如何保護我的SPA和Web.API?

該網站將完全在SSL下運行。用戶第一次登錄後,他/她將收到一封帶有鏈接的電子郵件,以確認註冊過程。密碼和「鹽」值將被加密存儲在數據庫中,不可能將密碼解密回來。該API將僅用於此應用程序。

我有一些問題,我需要之前回答再往前走:

  1. 哪種方法將是最適合我的應用程序在安全性方面:基本/ SimpleMembership?任何其他可能性?
  2. 對象Principal/IPrincipal是否僅用於Basic Authentication?
  3. 據我所知,如果我使用SimpleMembership,因爲使用了Cookie,這是不是打破了RESTful範式?所以如果我建立一個REST Web.API,我不應該避免使用SimpleMembership嗎?
  4. 我正在用令牌檢查ThinkTecture.IdentityModel。這是一種類似於基本身份驗證,表單身份驗證或身份驗證身份驗證的身份驗證類型,還是可以添加到其他身份驗證類型的身份驗證類型?

謝謝。

回答

4

很可能這個問題會因爲本地化而關閉。即使那樣,我也會提出幾點建議。這不是一個答案,但評論部分對此太小了。

  1. 什麼方法以及如何驗證完全取決於您的子系統。沒有一種方法可以爲每個人提供最好的服務。 SPA與任何其他應用程序沒有區別。您仍然可以根據身份驗證訪問某些資源。這可能是具有自定義授權屬性的API,可能是標頭值,基於標記,誰知道!無論你認爲最好。
  2. 我建議你閱讀更多關於這個瞭解如何工作。
  3. 使用cookie並不表示它會打破REST。你會發現很多關於這個特定項目的文章。 Cookie將通過您的請求傳遞,就像您傳遞服務器所需的任何特定信息以便爲您提供數據一樣。如果發送cookie中斷REST,那麼將參數發送到您的API應該會中斷REST!
  4. 現在,一種非常常見的方法(並不是一種方法)是使用基於令牌的SPA系統。原因很多,最簡單的解釋是,你的服務(Web API或其他)可以單獨託管,你的客戶端是作爲CORS客戶端工作的。在這種情況下,您以您選擇的任何形式進行身份驗證,創建一個安全令牌並將其發送回客戶端,並且每個需要經過身份驗證的用戶的資源都會根據令牌進行檢查。令牌將作爲報頭的一部分發送給每個請求。沒有令牌會導致簡單的401(未授權)或無效令牌可能導致403(禁止)。

沒有人說SPA需要全部是靜態的HTML,有數據綁定,也可以是你的MVC網站返回部分被加載(我過去做過的)。就只使用HTML和JS(Durandal專門)而言,甚至可以保護客戶端應用程序。最終,鎖定來自服務器的數據,並在收到401/403時將客戶端路由到登錄屏幕。

如果您對XSS或請求僞造的關注更多,即使只使用HTML和JS(儘管不如使用MVC丟棄防僞標記那樣簡單),仍有許多方法可以防止出現這種情況。

我的兩分錢。

+0

Sujesh,非常感謝您的回答。我知道SPA與任何其他應用程序沒有區別,我只是試圖設置場景以便更清楚地瞭解可能的答案。我明白你在回答1上的意思,但我想每種方法來進行認證都有優點/缺點。關於您最後一次關於令牌的評論,我記住了AntiForgeryToken屬性的用法,並且我知道如何使用它,但是如果我決定使用基於令牌的系統驗證,是否意味着我必須將請求發送給API,兩個令牌? (認證和AntyForgery)。 – Scheveningen 2013-04-30 00:36:01

+0

那是正確的。通常情況下,防僞令牌不過是帶有令牌的隱藏字段,隨後每次提交表單都會提交。在這種情況下,如果您只使用HTML,那麼您將顯式讀取令牌(將令牌放在主索引上,或者提出一種方法,它取決於身份驗證),然後將其作爲頭的一部分發送在你的ajax請求。 – 2013-04-30 12:37:33

3

如果您進行「直接」身份驗證 - 意味着您可以直接驗證密碼 - 您可以使用基本身份驗證。

我在這裏寫一下吧: http://leastprivilege.com/2013/04/22/web-api-security-basic-authentication-with-thinktecture-identitymodel-authenticationhandler/

此外,還可以考慮使用會話令牌來擺脫客戶端上的密碼: http://leastprivilege.com/2012/06/19/session-token-support-for-asp-net-web-api/

+0

謝謝,我會那樣做的。 – Scheveningen 2013-05-03 14:03:33