. NET базовый веб-API: войти в систему под именем пользователя вне контроллера - PullRequest
0 голосов
/ 22 апреля 2020

Мне нужно получить зарегистрированного в данный момент пользователя для ведения журнала аудита вне контроллера. Я использую Database First подход в. NET core 3.1 API проекте. Вот почему я создал новый класс контекста, который наследуется от класса MyContext для обработки аудита. Здесь я теперь хочу получить информацию о пользователе. Я использую аутентификацию на основе утверждений JWT.

В нижеуказанном классе " MyNewContext " я добавил IHttpContextAccessor в файл Startup.cs (services.AddHttpContextAccessor();), чтобы использовать его в " MyNewContext"класс, однако объекты User или Claims являются emtpy при вызове конструктора.

Кажется, что я могу получить объект User только тогда, когда IHttpContextAccessor используется внутри контроллера. Также, если я создаю класс обслуживания для IHttpContextAccessor, он имеет объект пользователя только при вызове внутри контроллера.

public class MyNewContext : MyContext
{
    private static string _userGuid;
    private readonly IHttpContextAccessor _httpContextAccessor;

    public MyNewContext(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
        GetUserGuid();
    }

    public void GetUserGuid()
    {
        _userGuid = _httpContextAccessor.HttpContext?.User?.FindFirst("unique_name")?.Value;
    }
}

Startup.cs

services.AddHttpContextAccessor();
services.AddDbContext<MyNewContext>(x => x.UseSqlServer(Configuration["ConnectionStrings:xyz"]));

Что я делаю неправильно? Есть ли другой способ получить информацию о пользователе?

Спасибо.

1 Ответ

0 голосов
/ 23 апреля 2020

В моем файле startup.cs у меня есть функциональность AddJwtBearer.

Теперь я просто передаю значение guidClaim в функцию SetGuid в MyNewContext. Нет необходимости в IHttpContextAccessor.

Claim guidClaim = (context.Principal.Identity as ClaimsIdentity).FindFirst("unique_name");

MyNewContext.SetGuid(guidClaim.Value);

Это работает для меня - пока.

...