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:
本地安全策略方式:
- 打开
secpol.msc(本地安全策略) - 导航到「本地策略 -> 安全选项」
- 找到「网络安全: 限制NTLM: 传入NTLM流量」,设置为「拒绝所有账户」或「拒绝域账户」(根据环境选择)
- 找到「网络安全: 限制NTLM: 允许服务器使用NTLM SSP接受NTLM请求」,设置为「已禁用」
- 打开
注册表方式(需管理员权限):
- 打开注册表编辑器,定位到
HKLM\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0 - 添加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
相关产品推荐
相关产品推荐

