本文提供了帮助来解决 S4U2Self 请求失败并出现错误KDC_ERR_C_PRINCIPAL_UNKNOWN的问题。
原始 KB 数: 2009157
现象
运行的应用程序服务器需要授权没有登录服务器的用户,以便使用 Active Directory 安全组成员身份进行基于角色的检查。 你正在使用 AuthZ API 执行此操作。 此问题可能发生的另一种情况是接受用户证书进行登录的服务器,例如 Web 服务器(如 Internet Information Server(IIS)。 若要检索访问检查本地资源所需的信息,LSASS 将执行 S4U2Self Kerberos 事务。 但是,这失败,用户无法登录,或者无法验证用户的角色。
在网络跟踪中,你可能会看到多个具有 PaData 类型 PA-PAC-REQUEST (类型 128)的请求,这些请求失败并出现错误 KDC_ERR_C_PRINCIPAL_UNKNOWN (错误代码 6)或 KDC_ERR_PREAUTH_REQUIRED (25)。 但这些不是致命的。 这些错误代码 6 表示发出请求的域控制器不托管帐户,客户端应选择其他域控制器。 错误代码 25 表示客户端在未正确验证的情况下无法检索用户的特权属性证书(PAC)。 然后,客户端获取用户域密钥分发中心(KDC)的正确票证。
接下来,最后一个请求使用 PaData 类型 PA-FOR-USER (类型 129)发送,应用程序服务器主机服务主体名称(SPN)作为 SName 和帧的 PaForUser 分支中的用户主体名称(UPN)。 请求上的客户端是应用程序服务器。
此请求现在也失败,并出现错误 KDC_ERR_C_PRINCIPAL_UNKNOWN (错误代码 6)。 这是一个致命错误。
注意
在网络监视器 3.x 中通过帧重新组装运行网络跟踪将很有帮助。
原因
Kerberos 错误实际上是 “拒绝访问” 错误,用于读取此属性。 S4U2Self 请求访问 TokenGroupsGlobalAndUniversal 用户构造的属性,并需要执行此操作的权限。 默认情况下,经过身份验证的用户具有这些权限。
解决方法
如果这些权限已更改或吊销,则需要将请求帐户添加到 Windows 授权访问组。 默认情况下,此组对所有用户和计算机帐户具有所需的访问权限。 如果还更改了 Windows 授权访问组的权限,则需要构造权限或使用自定义组授予权限。
详细信息
此行为与为证书登录案例设置公钥基础结构(PKI)的方式无关。 它还独立于服务器和用户位于同一林中还是位于不同的林中。 如果它们位于不同的林中,它将使用或不启用选择性身份验证。 如果启用了选择性身份验证,用户需要“允许对服务器进行身份验证”访问权限。
在证书登录案例中,服务器应用程序会在 Kerberos 事务成功时获取访问令牌的句柄。 此访问令牌不适用于 Kerberos 委派。
当 S4U2Self 请求失败时,可以获取 KDC 警告事件 ID 25。 需要将 KdcExtraLogLevel 设置为 0x08。 有关此注册表项的详细信息,请单击以下项目编号以查看Microsoft知识库中的文章:在 Windows Server 2003 中837361 Kerberos 协议注册表项和 KDC 配置密钥