在我的服务器端 Blazor 应用程序中,身份验证以非常规的方式处理。本质上,当用户访问该页面时,他们将使用其 Windows 凭据进行身份验证。此时,将创建一个自定义策略来在外部数据库 (Informix) 中查找该用户名,在该数据库中可以找到该用户在应用程序中的授权。特别是对于应用程序中的每个授权级别(可以更新、转到此页面等),我正在创建一个新声明,以根据数据库中存储的权限添加到当前用户。
通常在视图中,我只使用AuthenticationStateProvider
获取此信息并且它可以正常工作。但是,当我需要访问处理更新/业务逻辑的服务类中的用户信息时,我似乎根本无法访问声明/用户。例如,一个用例是根据初始身份验证期间添加的声明获取当前 Windows 帐户存储在数据库中的用户名,以记录其活动/轨迹。另一种方法是从数据库中获取当前登录用户的全名。
我已经在带有身份验证状态提供程序的服务类中尝试过 DI,并且HTTPContext
但它们都不起作用。我知道整体结构并不理想,但这是我必须处理的。
任何有关如何解决此问题的见解将不胜感激!
我注入的身份验证状态提供程序无法正常工作,因为我的服务类是单例,而身份验证状态提供程序是有范围的。简而言之,您不能在单例中使用作用域类(详细信息请参见此处:升级到 ASP.NET Core 2.0 后,无法使用单例 IActiveUsersService 中的作用域服务 IMongoDbContext https://stackoverflow.com/questions/45810851/cannot-consume-scoped-service-imongodbcontext-from-singleton-iactiveusersservice)
我更改了我的服务类,这些服务类取决于启动时范围内的身份验证状态提供程序,并且它的工作没有问题。
太长了;将 AuthenticationStateProvider 注入到您的服务类中,并使该类以及任何依赖于它的类在启动时具有作用域。
services.AddScoped<ServiceClass>();
那么您的服务类将如下所示:
private readonly AuthenticationStateProvider _authenticationStateProvider;
public ServiceClass(AuthenticationStateProvider authenticationStateProvider)
{
_authenticationStateProvider = authenticationStateProvider;
}
//Use authenticationStateProvider same as you do in view in class
任何依赖于该服务类的类也需要确定作用域,而不是单例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)