【问题标题】:AcceptSecurityContext (Kerberos) returns SEC_E_LOGON_DENIEDAcceptSecurityContext (Kerberos) 返回 SEC_E_LOGON_DENIED
【发布时间】:2012-12-19 22:53:30
【问题描述】:

我正在尝试编写一个执行 Kerberos 身份验证的简单应用程序(目前没有相互身份验证)。

操作系统为Windows server 2003,标准版。 我已经设置了 Active Directory 并使用 setspn 工具创建了一个 SPN。

AcquireCredentialsHandle 在客户端和服务器上都返回 SEC_E_OK。

客户端的InitializeSecurityContext返回SEC_E_OK。

服务器端的 AcceptSecurityContext 返回 SEC_E_LOGON_DENIED。

我确信我的代码没有任何问题,因为我在使用以下 MSDN 文章中的示例应用程序时看到了相同的行为:http://msdn.microsoft.com/en-us/magazine/dvdarchive/bb985043.aspx

所以我猜我的设置有问题。但我不知道是什么。也许我错过了 SPN 设置中的某些内容?任何帮助表示赞赏。

问候,大卫。

【问题讨论】:

    标签: kerberos


    【解决方案1】:

    是的,问题如下:

    比如说,你的电脑名是COMP,域NetBios名字是DOMAIN,你要注册的SPN是MyService/COMP。

    “setspn -A MyService/COMP COMP”命令为SYSTEM帐户注册SPN!当您属于另一个帐户(例如管理员)的进程想要充当该 SPN 的服务器时,它可以理解地失败了。

    您可以以 SYSTEM 身份运行您的服务器(谷歌了解如何操作)或(更好)使用以下命令为管理员(或任何其他)帐户注册 SPN:setspn -A MyService/COMP DOMAIN\Administrator

    【讨论】:

    • 这个答案没有意义。上述情况绝不应该发生。如果您输入错误的 SPN,它应该会在两端都失败。或者通过两端。它不应该通过客户端和失败的服务器端。另外,我不想设置任何东西或注册任何东西。 David 和 Davatuk 是同一个用户吗?
    • 这两个用例都通过了吗?
    • @cashcow:答案确实有道理。 SPN 是正确的,这就是您可以 AcquireCredials 的原因。但是,当票证被传递给运行服务器的进程并且该进程与权威机构联系以检查票证是否有效时,权威机构会检查票证的有效性,但还会检查是否允许进程验证此类票证。 .. 并且仅允许在 System-User 下在 COMP 上运行的进程验证 AnyService/COMP。用户空间进程因 LOGIN_DENIED 失败。
    • @Blazemonger:我尝试为用户注册 SPN,但随后客户端无法获取票证,并出现错误 UNKNOWN_ENCRYPTION。不确定这是否是普遍现象,但我不得不恢复到在 SYSTEM 下运行服务器。
    • @all: LOGIN_DENIED 也会发生,如果运行进程的计算机的 IP 没有正确地反向查找到 COMP(Service/COMP 中的主机名)。例如。 ftp/myhost.corp.somewhere.com 只会验证,如果尝试接受票证的进程在计算机的 SYSTEM 用户上运行,该计算机的 IP 可以反向查找到 myhost.corp.somewhere.com 跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    相关资源
    最近更新 更多