2

我有一个 aspnet 核心 MVC 应用程序,我需要注入IPrincipal当前请求,以便我知道谁是当前登录用户。我按照这篇文章没有问题。

现在我需要IPrincipal在我Dbcontext的自动填充审计字段(CreatedBy、UpdatedBy 等)。IPrincipal天真我可以在我的DbContext构造函数中注入:

public MyDBContext(DbContextOptions<MyDBContext> options, IPrincipal principal)

但我正在使用,它在 WebAPI 请求DBContextPool中重用实例。DbContext

IPrincipal在这种情况下注入的正确方法是什么?

- - - - - - - - - - 更新 - - - - - - - - - - -

我想我可以遵循与HttpContextAccesor相同的方法,并创建一个IClaimsPrincipalAccessor,将其注册为单例并将其注入到我的Dbcontext.

对于 asp net core 应用程序,我需要一个HttpContextClaimsPrincipalAccesorClaimsPrincipal来自哪里HttpContext.User

4

1 回答 1

2

您可以IPrincipal在启动时将其注册为瞬态服务,例如:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    services.AddTransient<IPrincipal>(provider => 
                provider.GetService<IHttpContextAccessor>().HttpContext.User);
    // ...
}

然后在您的 DbContext 构造函数上,您可以注入IServiceProvider将允许您获取当前IPrincipal实例的,例如:

public class YourDbContext : DbContext
{
    private IServiceProvider _services;
    public YourDbContext(IServiceProvider services)
    {
        _services = services;
    }
    public void SomeMethod()
    {
        var principal = _services.GetService<IPrincipal>();
        // ...
    }
}
于 2018-07-29T20:53:26.030 回答