当前用户ID到数据库上下文的全局过滤器

时间:2018-05-25 17:52:10

标签: c# asp.net-core entity-framework-core asp.net-core-2.0

我有一个我想要过滤的数据库上下文,以便登录用户只能看到他们拥有的项目。我只想在数据库上下文中指定此过滤器,因此我不必尝试在多个位置进行维护。最终结果是在我的数据库上下文中添加这样的过滤器:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    builder.Entity<Foo>().HasQueryFilter(f => f.OwnerId == getCurrentUserIdSomehow())
}

我尝试过的事情:

我的想法是创建一个服务来获取当前登录的用户:

public interface IUserProvider
{
    string GetUserId();
}

public class UserIdProvider : IUserProvider
{
    private IHttpContextAccessor _accessor;
    public UserIdProvider(IHttpContextAccessor accessor)
    {
        _accessor = accessor;
    }

    public string GetUserId()
    {
        var identity = _accessor.HttpContext.User.Identity;
        if (identity.IsAuthenticated)
        {
            return _accessor.HttpContext.User
                .FindFirst(ClaimTypes.NameIdentifier).Value.ToString();
        }
        else
        {
            return Guid.Empty.ToString();
        }
    }
}

然后,我可以在ConfigureServices()中的Startup方法中注入它:

services.AddTransient<IUserProvider, UserIdProvider>();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

然后,一旦我将该服务注入到我的数据库上下文的构造函数中,我的过滤器变为:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    builder.Entity<Foo>().HasQueryFilter(f => f.OwnerId == _userProvider.GetUserId())
}

这样可行,但有更简单或更简洁的方法吗?在构造数据库上下文时,感觉应该有一种更简单的方法来查找当前用户ID。

我考虑过将UserManager服务注入我的数据库上下文,但无法找到获取当前用户的方法。

0 个答案:

没有答案