-1

我的開發團隊開始使用SPA網頁,該網頁僅通過WebAPI使用數據。下面是本應該被該網站所使用的技術:如何保護Angular SPA網站?

  1. AngularJS - 爲SPA
  2. 承載令牌 - 後端安全

我已經做了功課,並檢查幾種方式來保護頁面和一個是(1)有一個mainController與後端進行通信來驗證用戶,如果有效,導航到預期的頁面,但重新路由,否則。但是,這裏主要關心的是每個動作的聊天/通話,數以千計的通話將通過服務器進行身份驗證。

(2)另一種建議的方法是有一個setInterval()調用,用於不時驗證用戶的會話 - 一旦他/她已經登錄。我想我已經在銀行網站上觀察到這種行爲。

如果您有其他方法,您可以推薦其他方法嗎?

+0

對我的問題downvote的任何解釋?有什麼不對? – KevinIsNowOnline

+0

也許是低估,因爲它可以被解釋爲基於意見?不是我同意,對我來說似乎是一個合理的問題。 –

回答

3

您正在製作SPA,因此我假設您想要保護的所有內容(您的數據)均通過您的WebAPI提供,並且您可以將您的Angular模板公開。

在這種情況下,您基本上可以忽略客戶端的身份驗證,並且僅對WebAPI的調用進行身份驗證。任何未經身份驗證,未經授權或來自過期會話的服務器調用均會返回HTTP 401,Angular可以通過重定向到登錄頁面來響應此HTTP 401。您可以使用HTTP Interceptor來簡化該代碼(這裏的示例從here中被盜)。

myapp.factory('myHttpResponseInterceptor',['$q','$location',function($q,$location){ 
    return { 
    response: function(response){ 
     return promise.then(
     function success(response) { 
     return response; 
     }, 
     function error(response) { 
     if(response.status === 401){ 
      $location.path('/signin'); 
      return $q.reject(response); 
     } 
     else{ 
      return $q.reject(response); 
     } 
     }); 
    } 
    } 
}]); 
//Http Intercpetor to check auth failures for xhr requests 
myapp.config(['$httpProvider',function($httpProvider) { 
    $httpProvider.interceptors.push('myHttpResponseInterceptor'); 
}]); 

另外,如果你知道你的服務器端的會話超時設置爲20分鐘,那麼你也可以使用一個HTTP攔截器來跟蹤你的最後一個HTTP請求的時間。當它達到19分鐘前,那麼你可以警告用戶,他們將在1分鐘內註銷,除非他們作出迴應,在這種情況下,你稱爲「保持活動」服務重置超時,否則在20分鐘重定向到會話過期頁面。所以不需要投票。

對於稍微好一些的用戶體驗,在每個視圖加載時,您可以對會話cookie的存在執行一些基本的客戶端檢查。如果它不存在(例如,它們已經從深層鏈接着陸),那麼您可以立即重定向到登錄而無需調用服務器。如果它確實存在,則照常進行,知道首次調用WebAPI將驗證它。

+0

嗨邁克 「..just驗證呼叫WebAPI」 - >哦,我現在明白,這是我所提到的上述問題描述相反。現在要在後端INSTEAD上檢查資源(包括頁面)的(1)Ajax調用優先(2)返回allow = true標誌(3)重新調用該重要路由調用。總共3次​​往返 「..過期會話返回HTTP 401」 - >攔截器只是檢查無效呼叫,然後返回401,然後如果401返回登錄頁面 - >如果用戶路由要登錄,他/她是否仍然可以瀏覽他允許的頁面? – KevinIsNowOnline

+0

澄清:1. *任何*用戶(授權與否)可以請求*任何*角路由。 2.視圖將呈現,其控制器將開始運行。此時用戶可能能夠看到視圖的內容,但就安全性而言,這是可以的,因爲視圖本身不包含敏感數據。 (它在UX方面並不是很好,但有簡單的解決方法。)3.控制器現在進行服務器調用以獲取數據。 4.服務器發現用戶未被授權查看此數據,因此返回401. 5. Angular放棄部分呈現的視圖並顯示登錄視圖。 –

+0

是的,你在_any_部分是正確的。在視圖已經顯示的部分,即使ajax調用沒有完成,我的頭頂,我知道這真的有一個解決方案,所以我想這不是一個問題。關於項目3至5,一切都很清楚。 :) 謝謝你的協助。如果你可以放棄一些基本的高級資源,我會很感激! – KevinIsNowOnline

1

您可以像平時使用基於cookie的身份驗證一樣使用基於CSRF請求中的cookie的token,並且在cookie上清理過期,只需要在此處添加的是angluarjs的響應處理端,如果發生auth錯誤,整個頁面刷新。如果您已經使用某種認證和csrf,那麼在服務器端沒有太多變化。

+0

嗨iamgopal,感謝您對此的意見。但不幸的是,基於cookie的認證並不是我們現在正在努力的方向。後端人員在C#後端提到了術語,承載令牌類型的身份驗證。 – KevinIsNowOnline