我在 Blazor 8.0 Wasm(托管)中使用 AuthenticationState 时遇到很大问题。 问题是,登录后,AuthenticationState 未刷新,并且 DefaultAuthorizationService.Authorize 方法获取旧的 ClaimPrincipal 数据。
所有服务都注册在DI容器中。
我已经实现了这样的自定义 AuthenticationStateProvider:
public class PersistentAuthenticationStateProvider : AuthenticationStateProvider
{
private readonly UserInfoProvider _userInfoProvider;
private readonly ILogger<PersistentAuthenticationStateProvider> _logger;
private ClaimsPrincipal UnauthorizedPrincipal => new ClaimsPrincipal(new
ClaimsIdentity(new List<Claim>(){new Claim(ClaimTypes.Name, "Anonymous")}));
public PersistentAuthenticationStateProvider(UserInfoProvider userInfoProvider,
ILogger<PersistentAuthenticationStateProvider> logger)
{
_userInfoProvider = userInfoProvider;
_logger = logger;
}
public override Task<AuthenticationState> GetAuthenticationStateAsync()
{
var claimsPrincipal = UnauthorizedPrincipal;
var info = _userInfoProvider.GetCurrentUserInfo();
if (info != null)
{
claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(
info.UserClaims.Select(x => new Claim(x.ClaimType, x.ClaimValue)),
authenticationType: "PersistentAuthenticationStateProvider"));
}
var stateTask = Task.FromResult(new AuthenticationState(claimsPrincipal));
return stateTask;
}
public void NotifyUserHasChanged()
{
NotifyAuthenticationStateChanged(GetAuthenticationStateAsync());
}
}
用户登录时,我在 PersistentAuthenticationStateProvider 的实例上调用 NotifyUserHasChanged() 方法,但没有任何反应。
我在 AuthorizeView.OnParameterSetAsync 获取 AuthenticationState 的地方放置了一个断点,当调用 NotifyAuthenticationStateChanged 时,不会执行此方法。
我的用户身份验证工作流程是:
但是如果我关闭浏览器并重新启动它,它将找到存储在本地存储中的用户数据,并且用户将被正确授权。
此外,如果我注销用户,我清除本地存储并 NotifyAuthenticationStateChanged,它将正确地未经授权。
注意:如果我使用“forceLoad:true”导航,它会起作用
我需要帮助来找出我做错了什么? 请帮忙
谢谢
发现问题了... 我将 PersistentAuthenticationStateProvider 注册为其本身和 AuthenticationStateProvider。 所以内存中有两个实例同时处于活动状态。