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

.NET 6/7中Mock Negotiate认证返回500错误的问题

问题原因

用Negotiate认证时测试接口返回500,JWTBearer却能正常运行,核心问题出在两点:

  • 生产环境配置的Negotiate认证依赖系统级的Kerberos/NTLM服务,测试环境没有对应的配置和支持,直接运行会触发内部错误
  • 测试代码里虽然添加了Test认证方案,但没替换掉原来的Negotiate默认认证Scheme,导致系统仍尝试用真实的Negotiate中间件处理请求
解决办法

修改测试代码中的ConfigureTestServices部分,确保系统使用自定义的Test认证方案而非真实的Negotiate中间件:

方案一:直接覆盖默认认证配置

HttpClient client = _factory.WithWebHostBuilder(builder =>
{
    builder.ConfigureTestServices(services =>
    {
        // 指定默认认证Scheme为Test,并添加自定义Handler
        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = "Test";
            options.DefaultChallengeScheme = "Test";
        })
        .AddScheme<AuthenticationSchemeOptions, TestAuthHandler>("Test", options => { });
    });
})
.CreateClient();

client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue(scheme: "Test");

var response = await client.GetAsync("/my-endpoint");

方案二:移除原有认证服务后重新配置(冲突场景下用)

如果上面的写法仍有冲突,可以先清除原有认证相关服务再添加自定义配置:

HttpClient client = _factory.WithWebHostBuilder(builder =>
{
    builder.ConfigureTestServices(services =>
    {
        // 移除原有认证服务,避免和自定义配置冲突
        services.RemoveAll<IAuthenticationSchemeProvider>();
        services.RemoveAll<IAuthenticationService>();

        // 添加自定义测试认证并设为默认Scheme
        services.AddAuthentication("Test")
            .AddScheme<AuthenticationSchemeOptions, TestAuthHandler>("Test", options => { });
    });
})
.CreateClient();
补充说明

Negotiate是基于Windows身份验证的协议,测试环境没有配置Kerberos/NTLM时,使用真实的Negotiate中间件必然会报错。测试时必须确保所有认证逻辑都被自定义的TestAuthHandler接管,避免系统尝试调用未配置的真实认证服务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:22:44