我们有一个使用 Httplistener 并使用 Kerberos 对请求进行身份验证的 .Net Windows 服务。当用户通过浏览器连接时,用户事件日志中的错误会显示 Kerberos 事件 ID 4:
Kerberos 客户端收到来自服务器$username$的 KRB_AP_ERR_MODIFIED 错误. 使用的目标名称是 HTTP/$servername$.$domain$.com.au。这表明目标服务器未能解密客户端提供的票证。当目标服务器主体名称 (SPN) 在目标服务使用的帐户以外的帐户上注册时,可能会发生这种情况。确保目标 SPN 仅在服务器使用的帐户上注册。如果目标服务帐户密码与在 Kerberos 密钥分发中心上为该目标服务配置的密码不同,也会发生此错误。确保服务器上的服务和 KDC 都配置为使用相同的密码。如果服务器名称不是完全限定的,并且目标域 ($domain$.COM.AU) 与客户端域 ($domain$.COM.AU) 不同,
由于某种原因,它报告的服务器是运行服务的用户。第一行:
Kerberos 客户端从服务器$username$收到 KRB_AP_ERR_MODIFIED 错误。
每个网站(包括服务器故障)都有针对此错误的修复,与 SPN 问题有关,但错误中始终包含服务器名称。我找不到带有用户名的上述消息。
我们尝试了不同的用户,它改变了错误消息的上述部分。所有域帐户都有相同的问题。如果我们以本地系统帐户运行服务,则不会出现此问题,但这会导致服务出现其他问题(它需要域帐户才能获得其他权限)。我们没有,也从未有过任何与我们尝试过的用户名同名的服务器。
有没有人看到这个用户名出现在这里的问题?解决方法是什么?
所有服务器都是 Windows 2012(不是 R2)。
很高兴您解决了自己的问题,但听起来您不明白为什么您的运行解决了问题。
最重要的是,需要在适当的对象上设置 SPN。听起来您在 AD 中运行该服务的计算机对象上设置了 SPN。这就是为什么如果您将服务更改为以 SYSTEM 身份运行,事情就会开始起作用的原因。但是,如果您将其更改为以域用户身份运行,则需要将 SPN 移至该用户。重要的是你移动它(阅读:从计算机帐户中删除它)而不仅仅是复制它。重复的 SPN 会破坏一切。
在这里找到解决方案:http: //blogs.technet.com/b/dcaro/archive/2013/07/04/fixing-the-security-kerberos-4-error.aspx
我跑了:
这解决了问题