在启用Kerberos之后,客户端有时会协商NTLM,直到重新启动客户端服务器为止。如何避免重启?

val*_*orl 5 .net windows kerberos negotiate ntlm-authentication

有关设置的一些上下文:

我们正在从NTLM切换到Kerberos(协商),以在各种.NET工作负载(例如IIS托管的Web API或简单的.NET命令行程序)之间进行服务到服务的身份验证。

对于从客户端到服务器的任何调用,中间都有一个API网关。我们在网关中有一些自定义逻辑,用于执行身份验证和强制执行Kerberos(使用NTLM票证拒绝协商标头)。正常的客户端-服务器流如下所示:

  1. 客户端(C)向服务器(S)发送请求
  2. 网关(G)拦截请求
  3. (G)使用WWW身份验证返回401挑战:协商
  4. (C)再次发送请求,并带有一个Authorization:Negotiate [ticket]标头
  5. (G)检查[ticket]并:
    5.a如果[ticket]为NTLM:“拒绝”请求(返回非成功状态码)
    5.b如果[ticket]为Kerberos:验证票证并(如果有效)通过请求到(S)

现在,为了不做大的改变,我们能够(在网关中)基于来自(C)的请求的原始目的地(应该是大致的主机名)配置发生Kerberos检查的请求和(S)的端口。

此设置可以正常工作,但偶尔会出现一个难以复制的问题:

  • 有时候,对于某些(S),当我们在(G)中启用Kerberos检入时,客户端(C)会继续发送NTLM票证(因此被拒绝)。
  • 尽管存在这样的事实,即(C)能够与Kerberos对话(G)的所有先决条件都得到满足-例如klist get HTTP/spn-of-G,即使冒充完全相同的用户,也可以从(C)执行a 并接收正确的Kerberos票证(C)通常以
  • 最重要的是,在与(C)相同的服务器上经常会有其他应用程序经过相同的流程
  • 重新启动运行(C)的Windows Server实例可以解决此问题,从而使(C)在重新启动后向(G)发送适当的Kerberos票证

我的问题是:是否有其他可能的方法可以解决这种情况,而无需重新启动服务器

我已经尝试过但没有成功的事情:

  • 重新启动在(C)上运行的应用程序。如果(C)是IIS应用程序,我尝试重新启动应用程序池,或者iisreset。但是我已经看到了这个问题,例如(C)是每15分钟运行一次完成的C#命令行程序。
  • 在运行(C)的服务器上刷新DNS ipconfig /flushdns
  • 在运行(C)的服务器上清除所有缓存的Kerberos票证(klist purge使用powershell脚本对所有登录会话执行)