据我所知,Microsoft 使用的两个 WWW-Authenticate 附加功能是
- NTLM
- 谈判
如果从服务器向下发送 Negotiate,则将根据一组条件使用 Kerberos
- 内联网区域
- 使用主机名而不是 IP 访问服务器
- IE 中的集成 Windows 身份验证已启用,主机在 Firefox 中受信任
- 服务器不是浏览器本地的
- 客户端的 Kerberos 系统已通过域 Controller 的身份验证
然后将在服务器和客户端之间尝试 Kerberos,如果不满足上述条件,则将尝试 NTLM。
我的问题是,服务器是否有某种方式表明不应发送 NTLM?目前,我通过跟踪 session 中的请求来处理此问题,如果收到 NTLM 消息,它将在该 session 生命周期的剩余时间内禁用 Kerberos 和 WWW-Authenticate。
最佳答案
初始的WWW-Authenticate
header 仅指定negotiate
。它不能再说明任何内容,例如“no NTLM”。
我认为可以使用 401 unauthorized
和第二个 Negotiate
header 响应客户端发送的第一个 Authenticate: {Base64 NTLMSSP} header ,其中可以包含响应 token ,可能包括指定仅 Kerberos 的 SupportedMechanisms
。
但我怀疑这只会让你“未经授权”
,因为它首先会退回到 NTLM。
关于kerberos - 我可以向客户端表明支持 SPNEGO 但 NTLM 不适用于 HTTP 请求吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/489950/