【问题标题】:Blazor AuthenticationStateProviderBlazor AuthenticationStateProvider
【发布时间】:2020-04-18 11:36:48
【问题描述】:

有没有办法在 Component 之外访问身份验证状态? 比如我正在尝试,

 public class ServersideCurrentUserIdentityProvider : ICurrentUserIdentityProvider, IDisposable
    {
        private Task<AuthenticationState> currentAuthenticationStateTask;
        private readonly AuthenticationStateProvider stateProvider;

        public ServersideCurrentUserIdentityProvider(AuthenticationStateProvider stateProvider)
        {
            this.stateProvider = stateProvider;
            stateProvider.AuthenticationStateChanged += OnAuthenticationStateChanged;
            currentAuthenticationStateTask = stateProvider.GetAuthenticationStateAsync();
        }

        private void OnAuthenticationStateChanged(Task<AuthenticationState> task)
        {
            this.currentAuthenticationStateTask = task;
        }

        public async Task<ClaimsPrincipal> GetCurrentUserPrincipal()
        {
            var state = await currentAuthenticationStateTask;
            return state.User;
        }

        public void Dispose()
        {
            this.stateProvider.AuthenticationStateChanged -= OnAuthenticationStateChanged;
        }
    }

这个类在 DI 中注册 作为

services.AddServerSideBlazor();
services.AddScoped<AuthenticationStateProvider, RevalidatingIdentityAuthenticationStateProvider<ApplicationUser>>();
services.AddSingletone<ICurrentUserIdentityProvider,ServersideCurrentUserIdentityProvider>()

我正在尝试使用 CurrentUserProvider 作为 db Context 的参数 作为

public class ExampleDbContext()
{
 public ExampleDbContext(DbContextOption opt, ICurrentUserProvider provider){

  override Task<int> onSaveChange(){
var principal=  await this.userProvider.GetCurrentPrincipal();
foreach .. 
entity.CreatedBy=principal.Name;
}
}

当我尝试运行时,我得到 exception 说,GetAuthenticationState 应该在 SetAuthentication 状态之后调用, 我该怎么做???

【问题讨论】:

  • 您在启动期间看到异常,因为每次调用数据库上下文时数据库的构造函数都会运行。它甚至会在您的用户有机会登录之前被调用。因此,您不能依赖 DbContext 中的服务,并且您需要处理可能没有用户与请求关联的事实。这意味着跳过 GetCurrentPrincipal 调用。
  • 这实际上并不正确。
  • @crypted 你找到解决方案了吗?尝试做类似的事情......

标签: asp.net-identity blazor blazor-server-side cookie-authentication


【解决方案1】:

就个人而言,我倾向于在任何业务逻辑中首先设置实体的任何“CreatedBy”/“DateCreated”/etc 属性。

话虽如此,如果您只是将 AuthenticationStateProvider 放入 ExampleDbContext 构造函数中会发生什么?调用它时是否会与 DbContext 一起解析,并允许您找出解析(调用)用户(如果存在)?

【讨论】:

    猜你喜欢
    • 2021-04-07
    • 2020-05-01
    • 1970-01-01
    • 2021-08-06
    • 2023-01-19
    • 2020-03-19
    • 1970-01-01
    • 2022-06-22
    • 2021-11-17
    相关资源
    最近更新 更多