2014-04-01 245 views
2

首先介紹一下我的應用程序。我必須通過webservices公開數據訪問,並且我選擇了ServiceStack來實現這一點。由於我不想有有狀態的web服務,我選擇使用Jwt令牌來處理用戶授權。客戶端進行身份驗證並從服務調用中獲取令牌,然後將該客戶端放入授權標頭中,並且每個請求都會對其進行驗證。ServiceStack令牌認證

在我的服務執行呼叫授權不僅僅是如果用戶登錄或沒有,但來自reuqest不同要求,例如檢查:

  1. 檢查權限的
  2. 檢查權限上對象A上對象O1
  3. 檢查許可乙O2

一些這些檢查可與請求的過濾器等在該服務執行製成,因爲它們取決於噸他在請求中傳遞了數據。

我的擔心是除了從數據庫中提取用戶權限所需的行程之外,還需要驗證令牌和從授權的所有級別中的頭部提取值。所以我正在尋找一種方法來管理每個請求的令牌。

我想到的是一個TokenAuthorizaionManager,能夠從請求中提取和區分令牌。我註冊這個類容器請求範圍

container.RegisterAutoWired<TokenAuthorizationManager>().ReusedWithin(ReuseScope.Request); 

然後,我有一個PreRequest過濾器,從容器中得到令牌授權管理器並加載從報頭中的數據令牌

PreRequestFilters.Add((req, res) => 
     { 
      var tokenManager = req.TryResolve<TokenAuthorizationManager>(); 
      if (tokenManager != null) 
       tokenManager.ExtractTokenInfo(req); 
     }); 

此時在任何授權/驗證步驟中,我使用相同的TokenAuthorizationManager來驗證權限和角色。

這是我能處理這種事情的最佳方式,還是在服務堆棧中使用非會話服務有令牌認證的更好方法?

附加信息:

  1. 我有不同的需要的不僅僅是用戶名/密碼更做出succesfull認證,所以我不希望使用servicestack身份驗證功能的用戶。
  2. 我的Web客戶端將是一個angularjs應用程序(如果我管理要堅持一切融合在一起)

感謝您能在這些問題上有何啓示。

回答

0

我沒有看到任何可以改善的地方,事實上在我看來,您正確地使用了預先請求過濾器。

我還實現了一個身份驗證提供程序,使用ServiceStack以預先請求篩選器的形式讀取輸入數據,就像執行此操作一樣。我們的客戶端也是使用Angular開發的,我們爲HTTP客戶端設置了一個攔截器來設置授權標頭(我們使用Restangular來更具體)。

預先請求過濾器允許您授予未授權用戶的服務未達到。對於更復雜的授權模式,您可能希望根據其他權限標準授權每個服務,我通常使用請求屬性。

如果我是你,我會檢查ServiceStack正在執行的授權的源代碼,並嘗試從那裏開始。