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