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

ASP.NET Core应用通过域名使用Negotiate认证登录失败

解决Negotiate认证在自定义域名下的401错误问题

针对你遇到的localhost环境认证正常、切换到https://test.com后出现401且凭证无法加载的问题,结合日志中的CredentialError和UnknownCredentials报错,以下是核心排查与修复步骤:

1. 配置SPN(服务主体名称)

Negotiate认证依赖Kerberos协议,自定义域名必须手动为服务运行账户注册正确的SPN:

  • 若服务运行在域账户(如DOMAIN\MyServiceAcct)下,执行命令:
    setspn -S HTTP/test.com DOMAIN\MyServiceAcct
    
  • 若服务用本地系统账户运行,执行:
    setspn -S HTTP/test.com localhost
    
  • 验证已注册的SPN:
    setspn -L DOMAIN\MyServiceAcct
    

2. 将域名加入本地Intranet站点

浏览器仅会自动向Intranet区域的站点发送Windows凭证,需手动配置:

  • 打开IE/Edge的「Internet选项」→「安全」→「本地Intranet」→「站点」→「高级」,添加https://test.com。Chrome会继承IE的区域设置。

3. 补充Negotiate的SPN指定

手动配置Kerberos服务名称,避免自动检测错误:

builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
    .AddNegotiate(options =>
    {
        options.KerberosServicePrincipalName = "HTTP/test.com";
        options.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
    });

4. 完善CORS策略以允许凭证

当前CORS策略未开启凭证支持,浏览器不会发送Windows凭证,需修改:

builder.Services.AddCors(options =>
{
    options.AddPolicy(name: MyAllowSpecificOrigins,
                      policy =>
                      {
                          policy.WithOrigins("https://test.com")
                                .AllowCredentials(); // 关键:允许携带凭证
                      });
});

如果是AJAX请求,前端需同时设置withCredentials: true

5. 确认主机映射与证书有效性

  • 检查C:\Windows\System32\drivers\etc\hosts文件,确保存在127.0.0.1 test.com的映射,保证域名指向本地。
  • 确认证书的**主题备用名称(SAN)**包含test.com,避免证书名称不匹配引发隐性认证失败。

6. 检查服务运行账户权限

  • 若使用非域账户运行服务,普通本地用户可能没有获取Kerberos票据的权限,建议改用域账户或本地系统账户。
  • 普通本地用户需额外被赋予注册SPN的权限(可通过组策略或AD配置)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:24:56