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

启用Windows认证后ASP.Net Core Web API调用报错<'是无效值起始符

问题分析与解决方案

错误本质

你看到的 < is an invalid start of a value 错误,本质是API返回的不是预期的JSON数据,而是IIS生成的401 Unauthorized错误页面(HTML格式)——HTML以<开头,导致JSON解析器无法处理,才抛出这个格式错误。日志里的Unauthorized状态码才是真正的问题核心:请求没有携带有效的Windows认证凭证,被IIS拦截拒绝了。

是否需要在API项目中添加认证代码?

需要。虽然你创建项目时选择了“无认证”,且希望通过IIS控制认证,但ASP.NET Core默认不会自动处理IIS传递过来的Windows身份信息,必须在项目中配置Windows认证支持,才能让应用识别并接受IIS完成的认证结果。

具体配置步骤

1. 配置ASP.NET Core项目支持Windows认证

在Program.cs中添加Windows认证相关的中间件:

var builder = WebApplication.CreateBuilder(args);

// 添加Windows认证服务
builder.Services.AddAuthentication(IISDefaults.AuthenticationScheme);
// 添加授权服务
builder.Services.AddAuthorization();

// 注册Controllers服务
builder.Services.AddControllers();

var app = builder.Build();

// 启用认证中间件(必须在UseAuthorization之前)
app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

app.Run();

2. 修复Blazor端的请求凭证问题

你的Blazor代码中,HttpClient默认不会自动携带当前用户的Windows凭证,导致请求被IIS判定为未授权。需要修改HttpClient的配置,让它使用默认凭证:

方式1:直接修改现有代码

public async Task SaveProductAync(Product myProduct)
{
    try
    {
        // 创建带默认凭证的HttpClientHandler
        var handler = new HttpClientHandler { UseDefaultCredentials = true };
        using var httpClient = new HttpClient(handler);
        
        HttpResponseMessage resp = await httpClient.PostAsJsonAsync<Product>("Product/SaveProduct", myProduct, new JsonSerializerOptions(JsonSerializerDefaults.Web));
        
        // 先检查响应状态,避免直接解析错误内容
        resp.EnsureSuccessStatusCode();
        
        savedProduct = await resp.Content.ReadFromJsonAsync<Product>();
    }
    catch (HttpRequestException ex)
    {
        // 处理请求错误,比如401、500等
    }
}

方式2:推荐的依赖注入方式(符合Blazor最佳实践)

在Blazor项目的Program.cs中配置HttpClient:

builder.Services.AddHttpClient("ApiClient", client =>
{
    // 设置API的基础地址
    client.BaseAddress = new Uri("http://你的API部署地址/");
})
.ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
{
    // 启用默认凭证传递
    UseDefaultCredentials = true
});

然后在组件中注入IHttpClientFactory创建客户端:

@inject IHttpClientFactory HttpClientFactory

public async Task SaveProductAync(Product myProduct)
{
    try
    {
        var httpClient = HttpClientFactory.CreateClient("ApiClient");
        HttpResponseMessage resp = await httpClient.PostAsJsonAsync<Product>("Product/SaveProduct", myProduct, new JsonSerializerOptions(JsonSerializerDefaults.Web));
        
        resp.EnsureSuccessStatusCode();
        savedProduct = await resp.Content.ReadFromJsonAsync<Product>();
    }
    catch (HttpRequestException ex)
    {
        // 处理异常
    }
}

3. IIS配置检查

确保IIS站点的认证设置中,仅启用“Windows认证”,禁用“匿名认证”,避免认证规则冲突。

4. 跨域场景额外配置(如果Blazor和API不在同一域)

如果Blazor应用和API部署在不同域名下,需要在API项目中配置CORS,允许携带凭证:

builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowBlazorApp", policy =>
    {
        policy.WithOrigins("http://你的Blazor应用地址")
              .AllowAnyHeader()
              .AllowAnyMethod()
              .AllowCredentials(); // 必须开启才能传递Windows凭证
    });
});

// 在UseAuthentication之后启用CORS
app.UseCors("AllowBlazorApp");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 11:06:36