从.NET5升级到.NET6后Blazor Server的JWT带双引号验证失败如何解决
问题解决说明
根因
升级到.NET6后,你项目依赖的Blazored.LocalStorage库也同步升级到适配.NET6的高版本,该版本对存储API的行为做了变更:
- .NET5对应的低版本
SetItemAsync传入字符串类型时会直接存储原始值 - .NET6对应的高版本
SetItemAsync会对所有传入参数默认执行JSON序列化,字符串类型序列化后会被额外包裹双引号
你读取时使用GetItemAsStringAsync会把双引号作为字符串内容一起读出,最终传给服务端的Token格式错误,导致JWT验证失效。
解决方案
方案1(推荐):使用字符串专属存储API
存储字符串类型的Token时使用SetItemAsStringAsync,该API不会对输入做JSON序列化,直接存储原始字符串,仅需要修改存储Token的代码即可,读取逻辑无需改动:
// 把原来的SetItemAsync替换为SetItemAsStringAsync await _locStorage.SetItemAsStringAsync("AuthToken", token);
方案2:读取Token后移除多余双引号
如果不想修改存储逻辑,可以在读取后对Token做裁剪处理,移除前后包裹的双引号:
var token = await _locStorage.GetItemAsStringAsync("AuthToken"); // 移除首尾双引号 token = token.Trim('"');
方案3:用泛型API反序列化读取
因为存储时是JSON序列化的结果,用泛型GetItemAsync<string>读取时会自动执行JSON反序列化,自动去掉多余双引号:
// 替换GetItemAsStringAsync为泛型读取 var token = await _locStorage.GetItemAsync<string>("AuthToken");
内容的提问来源于stack exchange,提问作者Smith Waliko Msiska
相关产品推荐
相关产品推荐

