.NET 8 Blazor交互式服务端登录后API请求未授权问题排查
问题描述
构建基于.NET 8的混合SSR(服务器端渲染)+交互式服务端渲染服务,通过SSR完成登录流程后,Blazor交互式页面的HttpContext显示用户已处于登录状态,但所有对后端API的请求均返回未授权,TestPage中的API请求直接返回登录页面文本而非预期内容。
问题原因
核心问题是注入的HttpClient未携带当前用户的认证Cookie:
- 交互式服务端渲染模式下,Blazor页面的
HttpContext对应当前SignalR连接的用户上下文,因此能正确显示已认证状态; - 但服务器端发起的
HttpClient请求与浏览器请求上下文分离,不会自动携带用户的认证Cookie,导致API接口判定请求未授权,并重定向到登录页面。
解决方案
1. 配置HttpClient携带认证Cookie
修改Program.cs中的HttpClient注册逻辑,从当前HttpContext中获取认证Cookie并添加到HttpClient请求头:
// 先注册IHttpContextAccessor builder.Services.AddHttpContextAccessor(); // 替换原有的HttpClient注册代码 builder.Services.AddScoped(sp => { var httpContextAccessor = sp.GetRequiredService<IHttpContextAccessor>(); var context = httpContextAccessor.HttpContext; var client = new HttpClient(); var baseAddress = new Uri(builder.Configuration["ApiUrl"] ?? "http://localhost:5009/"); client.BaseAddress = baseAddress; // 复制当前用户的Cookie到HttpClient请求头 if (context?.Request.Cookies != null) { foreach (var cookie in context.Request.Cookies) { client.DefaultRequestHeaders.Add("Cookie", $"{cookie.Key}={cookie.Value}"); } } return client; });
2. 确认中间件顺序正确性
确保Program.cs中的中间件顺序符合规范,认证相关中间件必须按以下顺序排列:
app.UseStaticFiles(); app.UseAntiforgery(); app.UseAuthentication(); // 先认证 app.UseAuthorization(); // 后授权
3. 跨域场景额外配置(若API与Blazor域名不同)
如果API服务和Blazor应用部署在不同域名下,需配置CORS允许携带凭证:
// 注册CORS策略 builder.Services.AddCors(options => { options.AddPolicy("AllowBlazorCredentials", policy => { policy.WithOrigins("http://your-blazor-app-domain") .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); // 允许请求携带Cookie }); }); // 启用CORS(需放在UseRouting之后、UseAuthorization之前) app.UseCors("AllowBlazorCredentials");
验证步骤
- 登录应用后进入
TestPage,点击"Get Test Data"按钮; - 通过浏览器开发者工具的网络面板,检查API请求是否携带了认证Cookie;
- 确认API返回内容为
Hello from the API!,而非登录页面文本。
内容的提问来源于stack exchange,提问作者silajim
相关产品推荐
相关产品推荐

