启用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
相关产品推荐
相关产品推荐

