自定义身份验证在 Blazor Wasm 8.0 上不起作用

问题描述 投票:0回答:1

我在 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 时,不会执行此方法。

我的用户身份验证工作流程是:

  1. 启动时,框架会检查用户是否登录,如果没有,则会重定向到LoginPage
  2. 用户输入用户名和密码并尝试登录
  3. 这会向 api 端点发出 Rest 请求并返回令牌。该令牌保存在本地存储中。
  4. 然后我请求获取包含用户声明的 UserInfo。
  5. 如果成功,我会将其存储到本地存储中并 NotifyAuthenticationStateChanged。
  6. 我使用 NavigationManager 导航到具有 [Authorize] 属性的 HomePAge。
  7. 框架调用AuthorizeView.OnParameterSetAsync(),并调用await AuthenticationState,该状态返回旧数据。

但是如果我关闭浏览器并重新启动它,它将找到存储在本地存储中的用户数据,并且用户将被正确授权。

此外,如果我注销用户,我清除本地存储并 NotifyAuthenticationStateChanged,它将正确地未经授权。

注意:如果我使用“forceLoad:true”导航,它会起作用

我需要帮助来找出我做错了什么? 请帮忙

谢谢

authentication authorization blazor-webassembly .net-8.0
1个回答
0
投票

发现问题了... 我将 PersistentAuthenticationStateProvider 注册为其本身和 AuthenticationStateProvider。 所以内存中有两个实例同时处于活动状态。

© www.soinside.com 2019 - 2024. All rights reserved.