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

WWW-Authenticate头部能否传递Kerberos?如何实现HTTP仅Kerberos认证?

问题解答

1. "Kerberos"作为WWW-Authenticate头部值是否合法?

不被主流浏览器支持,属于非标准用法。

HTTP标准和主流浏览器(Chrome、Edge、Firefox等)仅认可Negotiate作为Kerberos认证的WWW-Authenticate方案值——Negotiate是SPNEGO协议的HTTP实现,可协商使用Kerberos或降级到NTLM,但可以通过配置限制仅使用Kerberos。

虽然HTTP.sys提供了AuthenticationSchemes.Kerberos选项并会返回WWW-Authenticate=Kerberos头部,但浏览器没有实现对该方案的支持,因此会忽略该头部,无法触发Kerberos认证流程。

2. 如何实现仅Kerberos认证(禁止NTLM)?

正确的做法是继续使用Negotiate认证方案,通过配置HTTP.sys强制拒绝NTLM,只允许Kerberos:

步骤1:保留Negotiate配置

维持原有的Negotiate认证代码,无需改为Kerberos方案:

builder.Services.AddAuthentication(HttpSysDefaults.AuthenticationScheme);
builder.WebHost.UseHttpSys(options =>
{
    options.Authentication.Schemes = AuthenticationSchemes.Negotiate;
    options.Authentication.AllowAnonymous = false;
    options.UrlPrefixes.Add("http://+:80/AuthTest");
});

步骤2:配置服务器禁用NTLM

通过本地安全策略或注册表修改,限制HTTP.sys仅接受Kerberos:

  • 本地安全策略方式:

    1. 打开secpol.msc(本地安全策略)
    2. 导航到「本地策略 -> 安全选项」
    3. 找到「网络安全: 限制NTLM: 传入NTLM流量」,设置为「拒绝所有账户」或「拒绝域账户」(根据环境选择)
    4. 找到「网络安全: 限制NTLM: 允许服务器使用NTLM SSP接受NTLM请求」,设置为「已禁用」
  • 注册表方式(需管理员权限):

    1. 打开注册表编辑器,定位到HKLM\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0
    2. 添加DWORD值NTLMIncomingAuthenticationBlocked,设置为1(禁止所有NTLM传入认证)

步骤3:验证生效

  • 重启服务器和客户端浏览器
  • 用Wireshark抓包确认无NTLM流量,仅存在Kerberos交互;若客户端尝试使用NTLM,服务器会直接返回401拒绝

额外配置检查

  • 确保SPN正确注册到服务器账户:执行setspn -S HTTP/myhost.my.domain DOMAIN\ServerAccount
  • 客户端将站点添加到「本地Intranet」或「受信任站点」(IE/Edge的Internet选项 -> 安全 -> 本地Intranet -> 站点),确保浏览器自动发送Kerberos票据
  • 客户端执行klist purge清除旧票据,重新获取新票据后测试

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:35:26