如何将有关已登录用户的信息传递到ASP.NET MVC中的存储库?

时间:2016-08-02 18:08:17

标签: c# asp.net-mvc authentication repository

如果将数据库中的项目分配给特定用户且没有用户可以访问不属于他的数据,那么传递用户信息的最佳方式是什么?我有两个想法,但我不知道它们中的任何一个是否正确。

我不喜欢的第一个想法,因为每次我想从存储库获取任何数据时都需要传递用户名:

public class Repository : IRepository
{
    private DbContext dbContext = new DbContext();

    public IEnumerable<Item> GetItems(string userName)
    {
        return dbContext.Items.Where(i => i.UserName == userName);
    }
}

其次是注入用户名,对我来说看起来更自然,因为我可以使用存储库,就像没有用户身份验证一样,但我不知道它是否安全,是否是ASP.NET MVC样式:

public class Repository : IRepository
{
    private DbContext dbContext = new DbContext();
    private string userName;

    public Repository(string userName)
    {
        this.userName = userName;
    }

    public IEnumerable<Item> Items
    {
        get { return dbContext.Items.Where(i => i.UserName == userName); }
    }
}

// In NinjectDependencyResolver.cs:

public void AddBindings()
{
    kernel.Bind<IRepository>().To<Repository>().WithConstructorArgument(HttpContext.Current.User.Identity.Name);
}

我不知道在控制器或视图之外的其他地方使用HttpContext类是否合适。

这些是非常简单的例子,我没有编译它们,但我希望没有错误,你知道我的意思。当然UserName应该是用户的另一个表的一部分,但我尽可能简单。

1 个答案:

答案 0 :(得分:1)

public ItemsController : Controller {
    private readonly IItemsService _service;
    public ItemsController(IItemsService service) {
        _service = service;
    }

    public ActionResult Index(){
        return View("Index", _service.GetItemsForUser(HttpContext.Current.User.Identity.Name));
    } 

}

您的服务将如下所示

public class ItemsService : IItemsService {

    private readonly IItemsRepository _repository;

    public ItemsService(IItemsRepository repository) {
        _repository = repository;
    }

    public IEnumerable<Item> GetItemsForUser(string username) {
        return _repository.GetItems(username);
    }
}

你回购

public ItemsRepository : IItemsRepository, IRepository {

    private DbContext dbContext = new DbContext();

    public ItemsRepository() {

    }

    public IEnumerable<Item> GetItems(string username) {
        return _context.Items.Where(i => i.username == username).ToList();
    }
}

或类似于此结构的东西。我使用了接口,因为我假设使用了控制反转。