Приведенный ниже подход хорошо работает для меня, поскольку у меня есть возможность получить пользователя в сервисный уровень, от которого зависят мои проекты Razor.
Согласно руководству Дэвида Фаулера здесь , ясоздал класс UserAccessor
следующим образом:
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;
}
, который я регистрирую в своем проекте Razor при запуске, вызывая
services.AddTransient<IUserAccessor, UserAccessor>()
, а затем внедряю это в обработчики MediatR и мой DbContext кака также некоторые фабрики по мере необходимости.
private readonly IUserAccessor _userAccessor;
public EventLogFactory(IUserAccessor userAccessor)
{
_userAccessor = userAccessor ?? throw new ArgumentNullException(nameof(userAccessor));
}
IHttpContextAccessor
, на который ссылается UserAccessor
, требует Microsoft.AspNetCore.Http.Abstractions nuget в проектах, которые не ссылаются на Microsoft.AspNetCore.App метапакет и также потребует, чтобы ваш проект Razor также реализовывал AddHttpContextAccessor()
при запуске:
// Register IHttpContextAccessor for services to get access to the HttpContext.
services.AddHttpContextAccessor();
Надеюсь, это поможет.