如何在Authorization Filter中获取secrets.json或Azure密钥?
方案一:从请求服务中获取IConfiguration读取密钥
自定义过滤器无法直接通过构造注入依赖,你可以借助AuthorizationFilterContext的HttpContext.RequestServices获取已注册的IConfiguration实例,进而读取密钥保管库中的值:
public void OnAuthorization(AuthorizationFilterContext context) { // 从请求服务容器中获取IConfiguration var configuration = context.HttpContext.RequestServices.GetRequiredService<IConfiguration>(); // 读取密钥保管库中对应的连接字符串 var connectionString = configuration["KEY"]; // 按需初始化DbContext var optionsBuilder = new DbContextOptionsBuilder<DBContext>(); optionsBuilder.UseSqlServer(connectionString); var dbContext = new DBContext(optionsBuilder.Options); // ...后续业务逻辑 }
方案二:直接获取已配置的DbContext(更推荐)
既然你已经在Program.cs中注册了DBContext,完全不用手动重新构建配置,直接从服务容器中获取现成的实例即可:
public void OnAuthorization(AuthorizationFilterContext context) { // 直接获取已注册的DBContext实例 var dbContext = context.HttpContext.RequestServices.GetRequiredService<DBContext>(); // ...直接使用dbContext进行数据操作,无需手动配置连接字符串 }
进阶:让过滤器支持构造注入(更规范的写法)
如果希望过滤器能像控制器一样通过构造注入依赖,可以先把过滤器注册为服务,再通过特性引用:
- 在
Program.cs中注册过滤器:
builder.Services.AddScoped<MyAuthorizationFilter>();
- 修改过滤器类,添加构造注入:
public class MyAuthorizationFilter : IAuthorizationFilter { private readonly IConfiguration _configuration; private readonly DBContext _dbContext; // 通过构造函数注入依赖 public MyAuthorizationFilter(IConfiguration configuration, DBContext dbContext) { _configuration = configuration; _dbContext = dbContext; } public void OnAuthorization(AuthorizationFilterContext context) { // 直接使用注入的实例 var connectionString = _configuration["KEY"]; // 或者直接操作_dbContext // ... } }
- 在控制器上使用
ServiceFilter特性引用过滤器:
[ServiceFilter(typeof(MyAuthorizationFilter))] public class YourController : ControllerBase { // ...控制器逻辑 }
内容的提问来源于stack exchange,提问作者flashsplat
相关产品推荐
相关产品推荐

