如何获取令牌声明值并注入dbcontext服务

时间:2018-01-09 11:26:06

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

我有一个DbContext,我需要一个CompanyId来进行全局查询,比如多租户。

    public void SetGlobalQuery<T>(ModelBuilder builder) where T : BaseEntity
    {
        builder.Entity<T>().HasQueryFilter(e => e.CompanyId == _companyId);
    }

将CompanyId添加到令牌声明中,我如何获取声明值并注入DbContext?

    services.AddScoped(provider => {
        var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>();
        var options = optionsBuilder.UseSqlServer(Configuration.GetConnectionString("MyDbDatabase")).Options;
        var companyId = 1;
        return new DocContext(options, companyId);
    });

1 个答案:

答案 0 :(得分:2)

您可以通过IHttpContextAccessor服务访问当前用户,然后搜索CompanyId声明:

//using System.Security.Claims;

services.AddScoped(provider => {
    var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>();
    var options = optionsBuilder.UseSqlServer(Configuration.GetConnectionString("MyDbDatabase")).Options;

    var user = provider.GetRequiredService<IHttpContextAccessor>().HttpContext.User;
    int? companyId = int.TryParse(user.FindFirstValue("CompanyId"), out var companyId) ? companyId : (int?)null;

    return new DocContext(options, companyId);
});

请注意,CompanyId是一个可以为空的int。如果用户未经过身份验证,则CompanyId为null。

附注:如果您正在使用Identity,则会为您注入IHttpContextAccessor。否则你必须自己做。