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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:30:49