在Azure Functions 2.0中使用EasyAuth时将Dependencies注入ClaimsPrincipal到DbContext中

时间:2019-06-05 02:41:33

标签: c# azure entity-framework-core azure-functions

将Azure Functions 2.0与EasyAuth一起使用(Azure一键式选项可启用针对Azure广告的身份验证)。

这使我可以在函数定义中获得ClaimsPrincipal

public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequest req, ClaimsPrincipal principal)

那很好,但是我很希望能够在我的DbContext中访问当前的userId,因此我可以使用EFCore HasQueryFilter功能进行安全修整。

我的DbContext被注入到我的azure函数端点类中,我宁愿保持这种方式,而不是在端点中手动创建它。

虽然我可以在每个请求的上下文中设置一个属性,但我希望能够通过依赖注入将ClaimsPrincipal或它的一部分注入DbContext中,因此我不需要在每个函数中手动进行操作。

默认情况下,ClaimsPrincipal似乎并没有为注入而接线,我也没有弄清楚可以注入的另一个可以访问它的类。

1 个答案:

答案 0 :(得分:3)

通过注册IHttpContextAccessor在启动时进行注入

   public void Configure(IWebJobsBuilder builder)
   {
            builder.Services.AddHttpContextAccessor();
   }

然后可以在dbcontext中使用它

public DbContext(DbContextOptions<DbContext> options, IHttpContextAccessor httpContextAccessor) : base(options)
{
    if (httpContextAccessor != null)
    {
        var principal = httpContextAccessor.HttpContext.User;
        //do stuff here with principal
    }

}