I am trying to figure out how to get access to the current logged in username outside of an ASP.NET Controller.
For example I am trying to do this:
Track Created and Modified fields Automatically with Entity Framework Code First
To setup tracking on entities in the DbContext
.
Here is my ApplicationDbContext
but I keep getting an error saying _httpContextAccessor
is null
:
private readonly IHttpContextAccessor _httpContextAccessor;
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, IHttpContextAccessor httpContextAccessor)
: base(options)
{
_httpContextAccessor = httpContextAccessor;
}
It's only necessary to use IHttpContextAccessor when you need access to the HttpContext inside a service.
I understand that IHttpContextAccessor is registered as a singleton when services. AddHttpContextAccessor() is called, and that it uses AsyncLocal to access information for the current user. In just about all the examples I've seen, services dependent on IHttpContextAccessor are being registered as scoped or transient.
ASP.NET Core applications access the HTTPContext through the IHttpContextAccessor interface. The HttpContextAccessor class implements it. You can use this class when you need to access HttpContext inside a service.
The ApplicationDbContext links the database server to the data model classes in the Asp.Net application. This only calls dbContext. Table1. Field1 and has the value of a data table.
Try injecting the IHttpContextAccessor Interface
You can even abstract it further by creating a service to provide just the information you want (Which is the current logged in username)
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";
}
}
You need to setup IHttpContextAccessor
now in Startup.ConfigureServices
in order to be able to inject it:
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
//OR
//services.AddHttpContextAccessor();
services.AddTransient<IUserResolverService, UserResolverService>();
and pass that to your repository as needed to record associated username
@Nkosi has the correct answer but please note that IHttpContextAccessor is now under the namespace:
Microsoft.AspNetCore.Http;
And no longer under:
Microsoft.AspNet.Http;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With