在 Blazor 中的视图外部访问经过身份验证的用户



在我的服务器端 Blazor 应用中,身份验证以非常非常规的方式处理。本质上,当用户访问页面时,他们会使用其 Windows 凭据进行身份验证。此时,将创建一个自定义策略,以在外部数据库 (Inforix( 中查找该用户名,在该数据库中可以找到该应用程序中该用户的授权。特别是对于应用程序中的每个授权级别(可以更新,转到此页面等(,我正在创建一个新的声明,以根据数据库中存储的权限添加到当前用户。

通常,在视图中,我只是使用AuthenticationStateProvider来获取此信息,并且它没有任何问题。但是,当我需要访问处理更新/业务逻辑的服务类中的用户信息时,我似乎根本无法访问声明/用户。例如,一个用例是根据初始身份验证期间添加的声明获取存储在当前 Windows 帐户数据库中的用户名,以记录其活动/跟踪。另一种方法是从数据库中获取当前登录的用户全名。

我已经在带有身份验证状态提供程序和HTTPContext的服务类中尝试了 DI,但它们都不起作用。我知道整体结构并不理想,但这是我必须使用的。 有关如何执行此操作的任何见解将不胜感激!

我注入的身份验证状态提供程序不起作用,因为我的服务类是单一实例,而身份验证状态提供程序的作用域。简而言之,不能在单一实例中使用作用域类(详细信息可在此处找到:升级到 ASP.NET Core 2.0后,无法使用作用域内服务IMongoDbContext从单一实例IActiveUsersService(

我更改了依赖于身份验证状态提供程序的服务类,以便在启动中限定范围,并且它正常工作。

TLDR;将 AuthenticationStateProvider 注入到服务类中,并使该类和依赖于它的任何类在启动时限定范围。

services.AddScoped<ServiceClass>();

然后,您的服务类将如下所示:

private readonly AuthenticationStateProvider _authenticationStateProvider;
public ServiceClass(AuthenticationStateProvider authenticationStateProvider)
{
_authenticationStateProvider = authenticationStateProvider;
}
//Use authenticationStateProvider same as you do in view in class

依赖于此服务类的任何类也需要限定作用域,而不是单一实例。

相关内容

最新更新