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

ASP.NET Core Windows认证问题:OPTIONS请求后客户端未触发Negotiate

问题分析与解决方案

核心问题在于跨域场景下,浏览器未触发Negotiate认证流程,导致GET请求直接返回401。以下是针对性的排查和解决步骤:

1. 修正中间件执行顺序

CORS中间件必须在认证、授权中间件之前执行,否则预检OPTIONS请求可能被认证逻辑拦截,或者后续请求的CORS头无法正确生效。

调整Program.cs中的中间件顺序:

app.UseRouting();

// 先执行CORS中间件
app.UseCors("CorsPolicy");

// 再执行认证和授权
app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

2. 确保OPTIONS请求跳过认证

虽然CORS会处理预检请求,但认证中间件仍可能对OPTIONS请求进行校验,导致不必要的拦截。可以通过配置认证方案,跳过OPTIONS请求的认证检查:

在AddAuthentication后添加以下配置:

builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
    .AddNegotiate(options =>
    {
        options.Events = new NegotiateEvents
        {
            OnMessageReceived = context =>
            {
                // 跳过OPTIONS请求的认证
                if (context.Request.Method == HttpMethod.Options.Method)
                {
                    context.NoResult();
                }
                return Task.CompletedTask;
            }
        };
    });

3. 客户端必须携带跨域凭证

浏览器默认不会在跨域请求中发送认证凭证(如Negotiate令牌),必须显式配置请求携带凭证:

Fetch API示例:

fetch('https://your-api-domain:5001/Iwa/SiteCheck', {
  method: 'GET',
  credentials: 'include' // 关键配置
})
.then(response => response.json())
.catch(error => console.error('Error:', error));

Axios示例:

axios.get('https://your-api-domain:5001/Iwa/SiteCheck', {
  withCredentials: true // 关键配置
})
.then(response => console.log(response.data))
.catch(error => console.error('Error:', error));

4. 验证CORS策略的精确性

  • WithOrigins必须使用精确匹配的源(包含协议、域名、端口),不能使用通配符(*),因为AllowCredentials = true时通配符会失效。
  • 确认WithExposedHeaders("WWW-Authenticate")已正确配置,确保浏览器能读取到认证头。

5. 检查Kestrel的认证配置

确保Kestrel没有额外的认证限制,可在ConfigureKestrel中明确启用Windows认证支持:

builder.WebHost.ConfigureKestrel(options =>
{
    options.ListenAnyIP(5001, listenOptions =>
    {
        listenOptions.UseHttps("<my cert>", "<my secret>");
        // 启用Windows认证
        listenOptions.UseWindowsAuthentication();
    });
});

6. 排查浏览器限制

部分浏览器对Negotiate跨域认证有严格限制:

  • 本地开发时,Chrome需避免使用localhost以外的域名,或启动时添加--disable-features=CrossSiteDocumentBlockingIfIsolating参数。
  • 生产环境需确保API和前端域名在同一域或已正确配置CORS,且浏览器支持跨域凭证传递。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:15:00