c# - 在 Blazor 中的 View 之外访问经过身份验证的用户

标签 c# authentication .net-core blazor

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

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

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

最佳答案

我注入(inject)的身份验证状态提供程序不起作用,因为我的服务类是单例的,而身份验证状态提供程序是作用域的。简而言之,您不能在单例中使用作用域类(详情请参见:Cannot consume scoped service IMongoDbContext from singleton IActiveUsersService after upgrade to ASP.NET Core 2.0)

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

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

services.AddScoped<ServiceClass>();

然后您的服务类将如下所示:
private readonly _authenticationStateProvider;

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

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


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

关于c# - 在 Blazor 中的 View 之外访问经过身份验证的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59744356/

相关文章:

authentication - Azure AD : Calling web API gives error 401

javascript - 验证传入的请求

c# - ASP.NET Core 2 身份验证方案

.net-core - 发布具有大量二进制依赖项的 Azure Functions

c# - 不支持的 API 版本与 URI 中的版本 — 怎么了?

c# - 如何返回 System.Collections 程序集中的命名空间列表?

c# - 来自 C# : why do I have to override new/delete? 的 mingw DLL

c# - 我应该在带有 Unity 容器的控制台应用程序中的何处注册解析我的类型?

c# - 更改身份服务器 V3 登录页面的设计

c# - 使用树莓派 o 运行单个应用程序