Доступ к аутентифицированному пользователю за пределами представления в Blazor - PullRequest
2 голосов
/ 15 января 2020

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

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

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

1 Ответ

2 голосов
/ 15 января 2020

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

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

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

services.AddScoped<ServiceClass>();

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

private readonly _authenticationStateProvider;

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

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

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

...