Доступ к аутентифицированному пользователю за пределами представления в Blazor

В моем приложении Blazor на стороне сервера аутентификация обрабатывается очень нетрадиционным способом. По сути, когда пользователь заходит на страницу, он проходит аутентификацию, используя свои учетные данные Windows. В этот момент создается пользовательская политика для поиска этого имени пользователя во внешней базе данных (Informix), в которой находится авторизация для этого пользователя в приложении. Специально для каждого уровня авторизации в приложении (можно обновить, перейти на эту страницу и т. Д.) Я создаю новую заявку для добавления к текущему пользователю на основе разрешений, хранящихся в базе данных.

Обычно в представлении я просто использую AuthenticationStateProvider чтобы получить эту информацию, и она работает без проблем. Однако, когда мне нужно получить доступ к информации о пользователях в моих классах обслуживания, которые обрабатывают обновления / бизнес-логику, я не могу получить доступ к утверждениям / Пользователю вообще. Например, одним из вариантов использования является получение имени пользователя, хранящегося в базе данных для текущей учетной записи Windows, на основе заявки, добавленной во время первоначальной аутентификации для регистрации их действий / отслеживания. Другим было бы получение текущего имени пользователя, вошедшего в систему, из базы данных.

Я пробовал DI в классах обслуживания с поставщиками состояния аутентификации и HTTPContext но ни один из них не работает. Я знаю, что общая структура не идеальна, но это то, с чем мне приходится работать. Любое понимание того, как это сделать, будет высоко ценится!

Всего 1 ответ


Поставщик состояния аутентификации, который я вводил, не работал, потому что мой класс обслуживания был одноэлементным, тогда как поставщик состояния аутентификации ограничен. Короче говоря, вы не можете использовать класс с областью действия в синглтоне (подробности можно найти здесь: невозможно использовать сервис с областью действия IMongoDbContext из singleton IActiveUsersService после обновления до ASP.NET Core 2.0 )

Я изменил свои классы обслуживания, которые зависели от поставщика состояния проверки подлинности, который будет определен при запуске, и это работало без проблем.

TLDR; вставьте AuthenticationStateProvider в ваш класс обслуживания и сделайте этот класс и любой, который зависит от него, Scoped при запуске.

services.AddScoped<ServiceClass>();

Тогда ваш класс обслуживания будет выглядеть следующим образом:

private readonly _authenticationStateProvider;

public ServiceClass(AuthenticationStateProvider authenticationStateProvider)
{
     _authenticationStateProvider = authenticationStateProvider;
}

//Use authenticationStateProvider same as you do in view in class

Любые классы, которые зависят от этого класса обслуживания, также должны быть ограничены областями действия, а не одиночными.


Есть идеи?

10000