【问题标题】:Accessing an authenticated user outside of a view in Blazor在 Blazor 中的视图之外访问经过身份验证的用户
【发布时间】:2020-05-01 19:17:03
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以定义一个带有AuthenticationStateProvider类型参数的构造函数的服务类,并将该服务添加到DI容器中。我不明白这里有什么问题。
  • @enet 感谢您为我指明了正确的方向......我能够这样做,但我必须将我的服务实例更改为范围而不是单例......我下面的答案中的详细信息。

标签: c# authentication .net-core blazor


【解决方案1】:

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

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

TLDR;将 AuthenticationStateProvider 注入到您的服务类中,并在启动时将该类和任何依赖它的类设置为 Scoped。

services.AddScoped<ServiceClass>();

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

private readonly _authenticationStateProvider;

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

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

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

【讨论】:

  • 此解决方案对其他人有帮助。我已经使用了这种技术。但是,在 OnSetParameters Blazor 方法中使用它时似乎存在限制。总是有异常“GetAuthenticationStateAsync was called before SetAuthenticationState”
  • 我试过这个,但我无法让 AuthenticationStateProvider 在我的新服务类中被识别。因为我使用的是 SignalR-Azure,所以我不能使用 HttpContextAccessor,但我仍然需要用户名,所以我可以在 Context.SaveChanges() 覆盖中设置我的 LastEditedBy 属性。
猜你喜欢
  • 2016-01-15
  • 2020-08-25
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 2016-10-01
相关资源
最近更新 更多