.NET6 API部署至IIS后认证异常返回HTML而非JSON问题求助
问题解决:.NET6 API部署IIS后认证失败返回HTML而非JSON
问题现象
基于.NET6和Angular的应用部署到IIS后,API在错误场景(如Azure AD认证失败)下返回HTML页面,而非开发环境中正常的JSON响应。以ActiveMenu接口为例,开发环境认证错误时返回401状态码的JSON,部署后却跳转至HTML登录页面。
核心原因
默认情况下,ASP.NET Core的Azure AD认证在认证失败时会触发重定向跳转(跳转到登录页),这是为传统MVC应用设计的行为。但对于API服务来说,应该直接返回JSON格式的错误状态码,而非重定向。
解决步骤
1. 配置Azure AD Bearer认证,禁用重定向跳转
在Program.cs中,找到Azure AD认证的配置代码,添加事件配置,修改认证失败时的处理逻辑,直接返回401状态码的JSON响应:
builder.Services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme) .AddAzureADBearer(options => builder.Configuration.Bind("AzureAd", options)); // 配置Bearer认证事件,禁用重定向 builder.Services.Configure<JwtBearerOptions>(AzureADDefaults.BearerAuthenticationScheme, options => { options.Events = new JwtBearerEvents { OnChallenge = context => { // 禁止默认的重定向行为 context.HandleResponse(); // 返回401状态码和JSON格式的错误信息 context.Response.StatusCode = StatusCodes.Status401Unauthorized; context.Response.ContentType = "application/json"; return context.Response.WriteAsync(System.Text.Json.JsonSerializer.Serialize(new { error = "Unauthorized", message = "Azure AD认证失败,请检查令牌有效性" })); } }; });
2. 配置API行为,确保错误统一返回JSON
添加ApiBehaviorOptions配置,让框架在处理模型验证或其他错误时,也返回JSON格式响应:
builder.Services.Configure<ApiBehaviorOptions>(options => { options.InvalidModelStateResponseFactory = context => { var errors = context.ModelState .Where(e => e.Value.Errors.Count > 0) .SelectMany(e => e.Value.Errors) .Select(e => e.ErrorMessage) .ToList(); return new BadRequestObjectResult(new { error = "Invalid request", errors = errors }); }; });
3. 验证IIS配置(可选)
确保IIS站点的错误页配置中,没有强制将401等状态码重定向到HTML页面:
- 打开IIS管理器,找到目标站点
- 进入“错误页”功能,检查401状态码的处理方式,设置为“详细错误”或“返回自定义错误页(JSON格式)”,避免覆盖API的响应
代码验证
你的ActiveMenu接口代码无需修改,上述配置会全局处理认证失败的响应格式,确保接口在认证错误时返回401的JSON,而非HTML页面。
内容的提问来源于stack exchange,提问作者Anthony Godoy
相关产品推荐
相关产品推荐

