.NET 7 Blazor WASM中JWT授权[Authorize]返回500错误排查
问题排查与解决
1. 中间件顺序错误(核心原因)
当前中间件管道中UseAuthentication和UseAuthorization的位置不符合ASP.NET Core的规范,正确顺序应先执行路由匹配,再执行认证授权逻辑——因为需要先确定请求对应的端点,才能对该端点应用认证授权规则。
错误顺序:
app.UseAuthentication(); app.UseAuthorization(); // ... app.UseRouting();
修正后的正确顺序:
app.UseHttpsRedirection(); app.UseBlazorFrameworkFiles(); app.UseStaticFiles(); app.UseRouting(); // 先执行路由匹配 app.UseAuthentication(); // 再执行认证 app.UseAuthorization(); // 最后执行授权 app.UseSession(); app.MapRazorPages(); app.MapControllers(); app.MapFallbackToFile("index.html");
2. JWT生成方法的空引用风险
在BuildToken方法中,UserData user = new UserData();如果UserData类的Roles属性未初始化(默认值为null而非空集合),执行foreach (var userRole in userRoles)时会抛出NullReferenceException,导致Token生成失败或服务端内部异常。
解决方式:
- 要么在
UserData类中初始化Roles属性:
public class UserData { // 其他属性... public List<string> Roles { get; set; } = new List<string>(); }
- 要么在生成Token前做空值判断:
var userRoles = user.Roles ?? new List<string>();
3. Token验证参数配置建议
虽然当前注释掉了Issuer、Audience和Lifetime的验证,但生成Token时已经指定了这些字段,建议开启验证(取消注释),确保前后端配置一致,避免潜在的验证逻辑问题:
options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = builder.Configuration["Jwt:Issuer"], ValidAudience = builder.Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey (Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"])), };
4. 客户端请求头重复添加问题
如果多次调用_httpClient.DefaultRequestHeaders.Add("Authorization", ...),会导致请求中存在多个Authorization头,引发服务端解析异常。建议改为先移除再添加:
_httpClient.DefaultRequestHeaders.Remove("Authorization"); _httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}");
内容的提问来源于stack exchange,提问作者mz1378
相关产品推荐
相关产品推荐

