SQL Server 返回错误“用户 'NT AUTHORITY\ANONYMOUS LOGON' 登录失败。”在 Windows 应用程序中

Posted

技术标签:

【中文标题】SQL Server 返回错误“用户 \'NT AUTHORITY\\ANONYMOUS LOGON\' 登录失败。”在 Windows 应用程序中【英文标题】:SQL Server returns error "Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'." in Windows applicationSQL Server 返回错误“用户 'NT AUTHORITY\ANONYMOUS LOGON' 登录失败。”在 Windows 应用程序中 【发布时间】:2012-09-17 15:41:04 【问题描述】:

一个一直正常工作的应用程序(并且在大约 6 个月左右的时间里没有对其进行任何积极的开发)最近开始无法连接到数据库。运营管理员无法说出导致问题的可能变化。

客户端应用程序使用 Integrated Security=True 的硬编码连接字符串,但当应用程序尝试创建与数据库的连接时,它会抛出 SQLException 提示“用户 'NT AUTHORITY\ANONYMOUS LOGON 登录失败”。

我可以在这个帐户上通过 Management Studio 毫无问题地登录到数据库。我在这个问题上看到的所有事情都是针对 ASP.NET 项目的,显然是“双跳问题”,作为客户端应用程序最好不要成为问题。任何帮助将不胜感激。

编辑

客户端机器和服务器机器以及用户帐户在同一个域中。 当 Windows 防火墙关闭时会发生这种情况。

领先的理论是: 服务器在大约一周前重新启动,并且无法注册服务主体名称 (SPN)。未能注册 SPN 可能会导致集成身份验证回退到 NTLM 而不是 Kerberos。

【问题讨论】:

【参考方案1】:

如果您的问题与链接服务器有关,您需要查看一些事项。

首先,您的用户需要启用委派,如果唯一更改的内容,他们很可能会这样做。否则,您可以取消选中“帐户敏感且无法委派”复选框是 AD 中的用户属性。

其次,必须信任您的服务帐户才能进行委派。由于您最近更改了服务帐户,我怀疑这是罪魁祸首。 (http://technet.microsoft.com/en-us/library/cc739474(v=ws.10).aspx)

您提到您可能有一些 SPN 问题,因此请务必为两个端点设置 SPN,否则您将无法在 AD 中看到委派选项卡。还要确保您处于“Active Directory 用户和计算机”的高级视图中。

如果您仍然看不到授权选项卡,即使在更正了您的 SPN 之后,请确保您的域未处于 2000 模式。如果是,您可以“提升领域功能级别”。

此时,您现在可以将帐户标记为受信任的委托:

在详细信息窗格中,右键单击您想要信任的用户 委派,然后单击“属性”。

单击委派选项卡,选择受信任的帐户进行委派 复选框,然后单击“确定”。

最后,您还需要将所有机器设置为受信任的委派。

完成此操作后,重新连接到您的 sql 服务器并测试您喜欢的服务器。他们应该工作。

【讨论】:

不错的答案。我已经从这里的一个更新的问题链接回这个问题,其中情况不同,但症状和根本原因是相同的:***.com/questions/47871816/… 对计算机设备本身(不仅仅是服务帐户)上的委派配置的特别赞成票。大多数其他帖子都忽略了这一点。【参考方案2】:

首先:我的问题与您的问题不完全相同,但这篇文章是我写这篇文章时在谷歌出现的第一件事,因为Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON' 错误。该解决方案可能对搜索此错误的人有用,因为我在网上的任何地方都没有找到此特定解决方案。

就我而言,我使用 Xampp/Apache 和 php sqlsrv 尝试使用 Windows 身份验证连接到 MSSQL 数据库,并收到您描述的 Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON' 错误。我终于发现问题是在用户“本地服务”下运行的 Apache 服务本身,而不是我登录的用户帐户。换句话说,它实际上是在使用匿名帐户。解决方案是进入 services.msc,右键单击 Apache 服务,转到属性,转到登录选项卡,然后输入用户的凭据。这符合您与 SPN 相关的问题,因为您的 SPN 设置为从域上的特定用户运行。因此,如果没有运行正确的 SPN,Windows 身份验证将默认使用错误的用户(可能是“本地服务”用户)并给您匿名错误。

这与您的问题不同。本地网络上的所有计算机都不在域上,它们仅在工作组上。要将 Windows 身份验证与工作​​组一起使用,具有服务器的计算机(在我的情况下为 MSSQL Server)和具有服务请求数据的计算机(在我的情况下为 Apache)都需要有一个具有相同名称和相同密码的用户。

总而言之,我们两个案例中的Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON' 错误似乎是由服务未运行和/或不在正确的用户上引起的。确保正确的 SPN 或其他服务在正确的用户下运行应该可以解决问题的匿名部分。

【讨论】:

我已经回答了这个问题,所以我认为这对在谷歌搜索的人会有所帮助。许多其他论坛都有类似问题的帖子链接到这篇文章,得到的关于它是否真的有帮助的反应不一,所以我试图帮助解决这些问题,即添加相关信息和可能的解决方案,而不是请求帮助。 感谢您发布此信息,它让我弄清楚了为什么安装程序会因此错误而失败(自定义操作正在尝试连接到 SQL,并且自定义操作默认在 SYSTEM 下运行 VS 安装程序) . 非常感谢@Caboosetp!我在连接到 MSSQL 数据库时遇到问题,您解决了。【参考方案3】:

我认为用于对数据库进行身份验证的 AD 组一定发生了一些变化。将格式为 domain\webservername$ 的 Web 服务器名称添加到有权访问数据库的 AD 组。此外,还尝试将 web.config 属性设置为“false”。希望能帮助到你。

编辑:按照您编辑的内容进行。它很可能表明您的 SQL Server 的身份验证协议已从 Kerberos(默认,如果您使用 Windows 集成身份验证)退回到 NTLM .要使用 Kerberos 服务主体名称 (SPN),必须在 Active Directory 目录服务中注册。服务主体名称 (SPN) 是在服务器上运行的服务的唯一标识符。将使用 Kerberos 身份验证的每个服务都需要为其设置一个 SPN,以便客户端可以识别网络上的服务。它以计算机帐户或用户帐户在 Active Directory 中注册。虽然 Kerberos 协议是默认协议,但如果默认失败,将尝试使用 NTLM 进行身份验证过程。

在您的场景中,客户端必须建立 tcp 连接,并且它很可能在 LocalSystem 帐户下运行,并且没有为 SQL 实例注册 SPN,因此使用 NTLM,但是,LocalSystem 帐户继承自 System Context 而不是因此,真正的基于用户的上下文因“匿名登录”而失败。

要解决此问题,如果您的 SQL Server 在域用户帐户下运行,请您的域管理员手动注册 SPN。 以下链接可能对您有更多帮助:http://blogs.msdn.com/b/sql_protocols/archive/2005/10/12/479871.aspxhttp://support.microsoft.com/kb/909801

【讨论】:

其实经过一番挖掘,看起来是链接服务器的问题。为了安全起见,我们进行了一些人事变动和服务器帐户的更改。客户端应用程序的首要任务是查询带有所有其他服务器链接的视图。在 Management Studio 中运行该查询会产生相同的错误消息。我们现在正在摆弄链接。【参考方案4】:

您可能只需要在连接字符串中提供用户名和密码并设置 Integrated Security=false

【讨论】:

见上文,接受的答案。问题在于链接服务器和 SPN。【参考方案5】:

我的一个 SQL 作业遇到了同样的问题。它涉及将数据从一台服务器上传到另一台服务器。发生错误是因为我使用的是 sql Server 代理服务帐户。我使用所有服务器通用的 UserId(使用 Window 身份验证)创建了一个凭据。然后使用此凭据创建代理。在 sql server 作业中使用了代理,它运行良好。

【讨论】:

【参考方案6】:

尝试在连接字符串中设置“Integrated Security=False”。

<add name="YourContext" connectionString="Data Source=<IPAddressOfDBServer>;Initial Catalog=<DBName>;USER ID=<youruserid>;Password=<yourpassword>;Integrated Security=False;MultipleActiveResultSets=True" providerName="System.Data.SqlClient"/>

【讨论】:

【参考方案7】:

FWIW,在我们的例子中,在 IIS 上运行的 (PHP) 网站在尝试连接到数据库时显示此消息。

解决方案是编辑该网站上的匿名身份验证以使用应用程序池身份(我们将应用程序池条目设置为使用为该网站设计的服务帐户)。

【讨论】:

【参考方案8】:

解决了一个类似的案例:

在我们的例子中,我们希望使用 cnames 和登录当前安全上下文来设置链接服务器。

我们检查了运行 SQL Server 的服务帐户是否设置了正确的 spns,以及 AD 对象是否受信任以进行委派。但是,虽然我们能够直接连接到 cname,但在调用其 cname 上的链接服务器时仍然存在问题:Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.

我们花了很长时间才意识到我们使用的 cnames 用于 A 记录 [A],它设置在更高的 dns 级别,而不是在其自己的域 AD 级别中。最初,我们将 cname 指向 [A].example.com,而不是(应该)指向:[A].domain.ad.example.com

当然,我们遇到了这些关于匿名登录的错误。

【讨论】:

【参考方案9】:

知道了!解决了在 SQL Server 的安全会话中修改用户属性的问题。在 SQL Server 管理中,进入安全 -> 登录 -> 选择用于数据库连接的用户并进入他的属性。转到“Securators”选项卡并查找“Connect SQL”行,标记“Grant”选项并尝试一下。它对我有用!

问候

【讨论】:

以上是关于SQL Server 返回错误“用户 'NT AUTHORITY\ANONYMOUS LOGON' 登录失败。”在 Windows 应用程序中的主要内容,如果未能解决你的问题,请参考以下文章

错误:“SQL Server 未返回响应。连接已关闭。”

SQL Server 在以前可以工作的选择上返回错误

SQL Server 函数在错误的列中返回数据

在主键列(表)中插入重复值时在 SQL Server 中返回哪个错误代码

SQL Server 在地理列上返回错误

如何修复 RegCreateKeyEx() 返回错误 5,“访问被拒绝。”在 SQL Server 2017 中