You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 8 Blazor InteractiveAuto首次API调用返回302问题求助

问题分析与解决方案

核心问题根因

在.NET 8 Blazor InteractiveAuto模式下,首次访问SeriLog页面时,页面默认以Server渲染模式加载,此时WASM客户端尚未完成初始化/身份凭证同步。API请求仅携带Server端的Cookie,但服务器授权逻辑可能未正确识别该Cookie对应的已认证用户,导致返回302重定向到登录页。而客户端期望接收JSON数据,解析重定向返回的HTML时就会抛出'<'是无效的JSON起始值错误。切换页面后WASM已加载,后续请求携带客户端身份凭证,API调用恢复正常。


具体解决方案

1. 为API控制器配置多认证方案支持

确保API同时兼容Server端Cookie认证和WASM端Bearer令牌认证,避免首次Server渲染时的授权判断错误:

// Program.cs 配置认证服务
builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
    // 你的OIDC配置(如Authority、ClientId等)
})
.AddJwtBearer(options =>
{
    options.Authority = "https://你的认证服务器地址";
    options.Audience = "你的API受众标识";
});

// Serilog API控制器
[ApiController]
[Route("api/serilog")]
// 允许Cookie和Bearer两种认证方式
[Authorize(AuthenticationSchemes = $"{CookieAuthenticationDefaults.AuthenticationScheme},{JwtBearerDefaults.AuthenticationScheme}")]
public class SerilogController : ControllerBase
{
    [HttpGet]
    public IActionResult GetLogs()
    {
        // 日志查询逻辑
        return Ok(logData);
    }
}

2. 强制SeriLog页面使用WASM交互模式

直接指定SeriLog页面以WASM模式渲染,跳过Server渲染阶段,确保首次加载时就携带客户端身份凭证:

@page "/serilog"
@rendermode InteractiveWebAssembly
@inject HttpClient Http
@inject IAccessTokenProvider TokenProvider

@code {
    protected override async Task OnInitializedAsync()
    {
        // 初始化时获取并设置Bearer令牌
        var tokenResult = await TokenProvider.RequestAccessToken();
        if (tokenResult.TryGetToken(out var token))
        {
            Http.DefaultRequestHeaders.Authorization = 
                new AuthenticationHeaderValue("Bearer", token.Value);
        }
    }
}

3. 处理API请求的重定向异常

在HttpClient层面禁止自动重定向,手动处理302状态,避免JSON解析错误:

// WASM项目 Program.cs 配置HttpClient
builder.Services.AddScoped(sp =>
{
    var handler = new HttpClientHandler
    {
        AllowAutoRedirect = false // 禁用自动重定向
    };
    var client = new HttpClient(handler)
    {
        BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)
    };
    client.DefaultRequestHeaders.Accept.Add(
        new MediaTypeWithQualityHeaderValue("application/json"));
    return client;
});

// 页面中API调用逻辑
try
{
    var response = await Http.GetAsync("/api/serilog");
    if (response.StatusCode == HttpStatusCode.Redirect)
    {
        // 未认证时跳转登录页
        NavigationManager.NavigateTo("/login");
        return;
    }
    response.EnsureSuccessStatusCode();
    var logs = await response.ReadFromJsonAsync<List<LogEntry>>();
    // 处理日志数据
}
catch (Exception ex)
{
    // 其他错误处理
}

4. 验证认证状态同步

登录完成后,确保WASM客户端能正确获取身份令牌:

  • 检查OIDC配置中是否启用了SaveTokens = true,确保令牌被持久化
  • 在登录回调页面(如Login.razor)中触发WASM客户端的身份初始化

日志排查建议

查看首次API请求的请求头:

  • 确认Authorization头是否存在(Server渲染时可能无Bearer头)
  • 检查Cookie是否包含认证会话标识,且服务器端能正确解析该Cookie

内容的提问来源于stack exchange,提问作者tvbRPTI2754

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:45:21