Blazor Server登录后JWT访问异常及GetAuthenticationStateAsync重复调用问题求助
Blazor Server登录后JWT访问异常及GetAuthenticationStateAsync重复调用问题求助
我在Blazor Server项目里调用外部API做身份验证,API会返回JWT令牌。目前已经实现了一些基础逻辑,但遇到了棘手的问题,想请教各位大佬:
已实现的相关逻辑
- 登录时存储JWT:我用
ProtectedLocalStorage来保存令牌,代码如下:
await protectedLocalStorage.SetAsync("authToken", result.Data.Token);
- 自定义AuthenticationStateProvider处理授权:我写了一个
CustomAuthenticationStateProvider,用来读取本地存储的令牌、解析声明,同时给HttpClient的请求头加上授权信息,代码如下:
public override async Task<AuthenticationState> GetAuthenticationStateAsync() { ProtectedBrowserStorageResult<string> token; var anonymous = new ClaimsPrincipal(new ClaimsIdentity()); try { try { token = await _protectedBrowserStorage.GetAsync<string>("authToken"); } catch { token = new(); } if (!token.Success) { return new AuthenticationState(anonymous); } httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("\"", "")); var identity = new ClaimsIdentity(ParseClaimsFromJwt(token.Value), "jwt"); var user = new ClaimsPrincipal(identity); return await Task.FromResult(new AuthenticationState(user)); } catch (Exception exc) { return new AuthenticationState(anonymous); } }
- 登出时删除令牌:
await protectedLocalStorage.DeleteAsync("authToken");
遇到的问题
- 登录后
GetAuthenticationStateAsync重复调用:登录完成后,这个方法会被调用两次。第一次调用的时候,_protectedBrowserStorage根本拿不到值,还会抛出这个异常:
JavaScript interop calls cannot be issued at this time
我猜测第一次调用时机太早,Blazor还没准备好进行JS互操作,但不确定具体原因。
- 登录后跳转页面无法读取令牌:更关键的是,登录成功后跳转到其他页面,
GetAuthenticationStateAsync里的_protectedBrowserStorage还是返回null!明明令牌已经存在本地存储里了,但就是获取不到,导致后续的API请求都带不上授权头,业务逻辑没法正常走。
有没有大佬能帮我分析下原因,以及怎么解决这个问题,让我能在登录后的所有页面都正常读取到令牌呢?
备注:内容来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

