如何获取令牌声明值并注入 dbcontext 服务
How to get a token claim value and inject on a dbcontext service
我有一个 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);
});
可以通过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 是一个可为 null 的整数。如果用户未通过身份验证,则 CompanyId 为空。
旁注:如果您使用的是 Identity,则会为您注入 IHttpContextAccessor。否则你将不得不自己做。
我有一个 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);
});
可以通过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 是一个可为 null 的整数。如果用户未通过身份验证,则 CompanyId 为空。
旁注:如果您使用的是 Identity,则会为您注入 IHttpContextAccessor。否则你将不得不自己做。