首页 > 解决方案 > 在 Blazor 中的视图之外访问经过身份验证的用户

问题描述

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

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

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

标签: c#authentication.net-coreblazor

解决方案


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

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

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

services.AddScoped<ServiceClass>();

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

private readonly _authenticationStateProvider;

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

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

任何依赖此服务类的类也需要限定范围而不是单例。


推荐阅读