2

我想弄清楚如何访问ASP.NET控制器以外的当前登录用户名。注入IHttpContextAccessor到ApplicationDbContext ASP.NET核心1.0

比如我试图做到这一点:

Track Created and Modified fields Automatically with Entity Framework Code First

要设置跟踪上在DbContext实体。

这是我ApplicationDbContext但我不断收到一个错误说_httpContextAccessornull

private readonly IHttpContextAccessor _httpContextAccessor; 

public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, IHttpContextAccessor httpContextAccessor) 
    : base(options) 
{ 
    _httpContextAccessor = httpContextAccessor; 
} 

回答

3

尝试注入IHttpContextAccessor接口

你甚至可以将它抽象进一步通过创建服务提供公正的信息你想要(这是当前登录用户名

public interface IUserResolverService { 
    string GetUser(); 
} 

public class UserResolverService : IUserResolverService { 
    private readonly IHttpContextAccessor accessor; 
    public UserResolverService(IHttpContextAccessor accessor) { 
     this.accessor = accessor; 
    } 

    public string GetUser() { 
     var username = accessor?.HttpContext?.User?.Identity?.Name ; 
     return username ?? "unknown"; 
    } 
} 

您需要设置IHttpContextAccessor现在Startup.ConfigureServices为了能够注入它:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
services.AddTransient<IUserResolverService, UserResolverService>(); 

,并根据需要记录相关联的用户名传递到你的资料库

+0

我刚刚在其中看到了一篇文章。我应该只是将它注入到我的ApplicationDbContext中并创建一个私有属性? –

+0

或多或少。是的 – Nkosi

+0

好的,我打算一直希望它能够自动注入。 –

3

@Nkosi有正确的答案,但请注意,IHttpContextAccessor现在的命名空间下:

Microsoft.AspNetCore.Http; 

,不再下:

Microsoft.AspNet.Http;