What is the best way to model the current user in a query? I'm creating a razor page application. I need to be able to attach the current user when I am executing queries and commands. Is there a recommended approach for doing this?
The below approach works well for me as I have the get the user into a service layer that my Razor projects depend on.
As per the guidance by David Fowler here, I created a UserAccessor
class as follows:
public interface IUserAccessor { ClaimsPrincipal User { get; } }
public class UserAccessor : IUserAccessor
{
private readonly IHttpContextAccessor _accessor;
public UserAccessor(IHttpContextAccessor accessor)
{
_accessor = accessor ?? throw new ArgumentNullException(nameof(accessor));
}
public ClaimsPrincipal User => _accessor.HttpContext.User;
}
which I register in my Razor project on startup by calling
services.AddTransient<IUserAccessor, UserAccessor>()
and then inject that into the MediatR handlers and my DbContext as well as some factories as required.
private readonly IUserAccessor _userAccessor;
public EventLogFactory(IUserAccessor userAccessor)
{
_userAccessor = userAccessor ?? throw new ArgumentNullException(nameof(userAccessor));
}
The IHttpContextAccessor
referenced in UserAccessor
requires the Microsoft.AspNetCore.Http.Abstractions nuget in projects that don't reference Microsoft.AspNetCore.App meta package and will also require that your Razor project implements AddHttpContextAccessor()
on startup as well:
// Register IHttpContextAccessor for services to get access to the HttpContext.
services.AddHttpContextAccessor();
Hope this helps.
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