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

Dan*_*Dan 3 c# authentication .net-core blazor

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

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

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

Dan*_*Dan 5

我注入的身份验证状态提供程序不起作用,因为我的服务类是单例,而身份验证状态提供程序是有范围的。简而言之,您不能在单例中使用作用域类(详情见此处:无法使用单例 IActiveUsersService 中的作用域服务 IMongoDbContext 升级到 ASP.NET Core 2.0 后

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

TLDR;将 AuthenticationStateProvider 注入到您的服务类中,并使该类以及任何依赖于它的类在启动时成为 Scoped。

services.AddScoped<ServiceClass>();
Run Code Online (Sandbox Code Playgroud)

那么您的服务类将如下所示:

private readonly _authenticationStateProvider;

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

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

Run Code Online (Sandbox Code Playgroud)

任何依赖于这个服务类的类也需要被限定而不是单例。

  • 我尝试了这个,但是我无法在我的新服务类中识别“AuthenticationStateProvider”。因为我使用的是 SignalR-Azure,所以无法使用“HttpContextAccessor”,但我仍然需要用户名,以便可以在“Context.SaveChanges()”覆盖中设置“LastEditedBy”属性。 (2认同)