Blazor UserManager.GetUserAsync 抛出 NullReferenceException

Blazor UserManager.GetUserAsync throwing NullReferenceException

UserManager.GetUserAsync(authState.User) 抛出异常,除非 UserManager 已经被调用。

例如;

这会在 await UserManager.GetUserAsync(authState.User) 上引发 NullReferenceException

@ page "/"
@inject UserManager<ApplicationUser> UserManager

<AuthorizeView>
  ...
</AuthorizeView>

@code{
    [CascadingParameter]
    private Task<AuthenticationState> authenticationStateTask { get; set; }

    protected async override Task OnInitializedAsync()
    {
      var authState = await authenticationStateTask;
      var currentUser = await UserManager.GetUserAsync(authState.User); // exception here
    }
}

但这工作正常;

@ page "/"
@inject UserManager<ApplicationUser> UserManager

<AuthorizeView>
  ...
</AuthorizeView>

@code{
    [CascadingParameter]
    private Task<AuthenticationState> authenticationStateTask { get; set; }

    protected async override Task OnInitializedAsync()
    {
      var allUsers = UserManager.Users.ToList(); // hack

      var authState = await authenticationStateTask;
      var currentUser = await UserManager.GetUserAsync(authState.User); // this is now working OK
    }
}

为什么我需要触发UserManager才能使用GetUsersAsync方法?

SignInManager<TUser>UserManager<TUser> 在 Razor 组件中不受支持。

See source...

它们不受支持的原因是它们只能在服务器上使用。你的问题的真正原因是你没有提供 UserManager<> 用于注入。

注意:IdentityUser 是用户的基础 class。模板没有提供继承这个的ApplicationUser。

所以在Startup.cs

 services.AddTransient<UserManager<ApplicationUser>>();
@page "/"
@using Microsoft.AspNetCore.Identity
@inject UserManager<ApplicationUser> UserManager

@currentUser?.Email

@code{
    [CascadingParameter]
    private Task<AuthenticationState> authenticationStateTask { get; set; }

    ApplicationUser currentUser;

    protected async override Task OnInitializedAsync()
    {
      var authState = await authenticationStateTask;
        if (authState.User.Identity.IsAuthenticated)
        {
            currentUser = await UserManager.GetUserAsync(authState.User); // exception was here
        }
    }
}