在MVC应用程序的存储库层中进行授权的模式

Eri*_*ric 6 .net c# asp.net-mvc repository-pattern asp.net-mvc-4

我有一个带有存储库层的Windows身份验证的MVC应用程序.控制器与数据库的所有交互都是通过存储库完成的.每个控制器都有对存储库的引用:

public class PostController : Controller
{
    private Repository db = new Repository();

    [HttpPost]
    public ActionResult DeletePost(int id)
    {
        // Authorize that the user is allowed to delete this post...

        db.DeletePost(id);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否有一种将授权逻辑移动到存储库层的好方法.我希望该Repository.DeletePost()函数拒绝删除未经过身份验证的用户创建的帖子.问题是我的存储库不知道经过身份验证的用户是谁.控制器知道(通过Controller.User).

路过Controller.UserRepository构造函数不工作,因为Controller.User显然没有在的时候调用构造函数定义.

如何通知Repository认证用户是谁?Repository在每个动作中构建内部是否最好?或者在存储库层中处理它是一个坏主意?

Big*_*ddy 5

或者在存储库层处理它是一个坏主意?

我认为 Controller 是您授权的更好地方。让存储库成为数据的网关,让控制器成为应用程序的看门人。我希望在生命周期的早期看到授权/身份验证逻辑。


Eri*_*ric 1

@BigDaddy 和 @ChrisPratt 都提出了很好的建议。

我最终通过创建一个基本控制器来解决这个问题,类似于这个答案。我的基本控制器类如下所示:

public class BaseController : Controller
{
    private ILog _log;
    private Repository _db;

    protected Repository Db
    {
        get
        {
            return _db ?? (_db = new Repository(User));
        }
    }

    protected ILog Log
    {
        get
        {
            return _log ?? (_log = LogManager.GetLogger(this.GetType()));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的所有控制器都继承自此类,并且具有对延迟加载的内置访问权限,Repository该延迟加载具有对当前经过身份验证的用户的引用。