通过n层应用程序传递用户身份

时间:2014-10-03 12:43:03

标签: c# asp.net-mvc entity-framework unit-of-work n-tier-architecture

我有一个MVC.Net应用程序,它被分成包含AngularJS和MVC控制器的存储库,业务逻辑和前端服务的层。

存储库目前是独立的,不包含在工作模式单元中。这种重构将会发生。

我想向人们询问,根据他们的经验,通过各层实现当前登录用户的最有效方式是在存储库级别启用安全性。

目前我有一个UserLogic类,它维护对当前登录用户实体的引用。然后将此UserLogic类注入控制器/业务逻辑等......但我怀疑这是一个相当复杂的机制!

1 个答案:

答案 0 :(得分:1)

一种方法可能是让任何给定的存储库在实例化时需要用户上下文。像这样:

public class WidgetRepository
{
    private UserContext User { get; set; }

    public WidgetRepository(UserContext user)
    {
        if (user == null)
            throw new ArgumentNullException("user");
        // maybe also confirm that it's a *valid* user in some way?
        User = user;
    }

    // repository operations
}

我想你可以在你的构造函数中使用尽可能多的“防御性编程”。然后,在存储库操作中,您可以根据该用户筛选查询。类似的东西:

public IEnumerable<Widget> Widgets
{
    get
    {
        return dbContext.Widgets.Where(w => w.Owner.Id == User.Id);
    }
}

这会过滤掉对应用程序透明拥有它们的用户的所有小部件。

请记住,这类事情需要权衡利弊。这样做在某些情况下可以很好地工作,在其他情况下则不太好。如果DAL基于用户上下文透明地过滤数据,则使用相同的DAL执行系统(非用户)操作或管理(超级用户)操作可能变得非常困难。我不可能说这对我目前对你的系统的了解是否会成为一个问题,这只是我过去看到的问题的一个单挑。