0

用戶被分配到一個或多個部門。更好的方法來檢查用戶訪問Web API,服務層,DB

用戶擁有一個或多個角色,例如讀取自己的角色只能查看他/她的任務。 團隊成員角色可以查看和編輯他人分配給他/她的部門中的任務。 具有角色的用戶Admin可以查看和編輯系統中的所有任務。

由於未經授權的訪問阻止和性能原因,我們希望將當前登錄的用戶ID一直傳遞到數據庫,以便只能獲取他/她有權訪問的記錄。

我們的系統設計是:

的Web API - >業務/服務層 - >庫 - > DB

目前,我們正在通過用戶ID從網頁API服務層中的每個方法的地方例如檢查用戶是否具有角色團隊成員(誰可以查看/編輯其他用戶可以訪問的部門中的任務) 並獲取他有權訪問的所有部門,然後進一步傳遞到存儲庫。

有沒有更好的方法來避免在每個方法中傳遞用戶ID? 上述設計中用於檢查用戶訪問權的最佳位置是什麼?

我們希望沒有用戶標識參數的方法能夠在另一個應用程序中使用相同的類進行報告。

任何想法?

+0

你可以傳上來的帳戶及其他相關信息的cookie,那麼有一個處理檢查帳戶及其他信息基本服務。也可以使用Attributes作爲一種乾淨的方式來檢查一個呼叫是否被授權。作爲上面相關服務方法的[ReadOwnRoleRequired]示例。目前無法提供代碼示例,因此現在應留下評論。 – NPhillips

+0

您剛剛提到「團隊成員角色可以查看和編輯他/她所屬部門內的其他任務」。那麼我猜你必須通過用戶ID才能獲得相關記錄!不是嗎? –

+0

@NPhillips:謝謝。但用戶TeamMember可以訪問其部門中其他用戶的任務。我們不僅需要檢查角色,還需要檢查當前用戶有權訪問哪個部門,並將其傳遞給db以僅查詢這些部門。 – Iffi

回答

0

使用依賴注入注入一些ICurrentUser實例需要用戶ID進行查詢和其他任務的服務。

public interface ICurrentUser 
{ 
    int UserId { get; } 
} 

public class AspNetCurrentUser : ICurrentUser 
{ 
    public int UserId { get { return HttpContext.Current.User.GetUserId<int>(); } } 
} 

public class Service : IService 
{ 
    private readonly ICurrentUser _currentUser; 

    public Service(ICurrentUser currentUser) 
    { 
     _currentUser = currentUser; 
    } 

    public object WorkWithUserId() 
    { 
     return _currentUser.UserId; 
    } 
} 
+0

我做了一些非常相似的事情。 :) – Iffi

+0

@Iffi我很高興聽到! :) – maxbeaudoin

0

有一個安全層(由裝飾你的服務層類的類組成)檢查用戶是否有權提出請求。

例如,如果您的Web API調用是../viewTask/456,請檢查用戶是該任務所屬部門的Admin,Team成員還是其自己的任務。

如果訪問控制檢查通過或在引發失敗時引發未授權異常,則裝飾器類傳遞給包裝的服務圖層類。

喜歡的東西...

public class SecuredTaskController : ApiController 
{ 
    private IContext _context; 
    private ITaskService _taskService; 
    // other services needed for access check (eg. userService?) 

    public SecuredTaskController(ITaskService taskService, IContext context 
     // other services needed for access check (eg. userService?) 
     ) 
    { 
     _taskService = taskService; 
     _context = context; 
    } 

    public IHttpActionResult Get(Task task) 
    { 
     if (hasGetAccess(task, _context.UserId)) 
      return Ok(_taskService.Get(task)); 
     else 
      return Unauthorized(); 
    } 

    private bool hasGetAccess(Task task, long userId) 
    { 
     // check if userId has acces to get task 
    } 
} 
+0

看到這樣的例子會很有趣 - 你可能在Github上有一個Gist或什麼的? – dmcquiggin