72

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

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

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

编辑

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

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

4

9 回答 9

31

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

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

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

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

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

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

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

单击委派选项卡,选中帐户受信任以进行委派复选框,然后单击确定。

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

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

于 2012-09-18T03:00:30.880 回答
10

首先:我的问题与您的问题不完全相同,但这篇文章是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 或其他服务正在运行并且在正确的用户下应该解决问题的匿名部分。

于 2015-07-10T15:01:02.237 回答
6

我认为用于对数据库进行身份验证的 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.aspx
http://support.microsoft.com/kb/909801

于 2012-09-17T16:10:49.130 回答
4

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

于 2017-05-22T06:11:36.150 回答
2

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

于 2015-08-12T14:42:02.873 回答
1

尝试在连接字符串中设置“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"/>
于 2018-12-17T06:32:11.220 回答
1

解决了一个类似的案例:

在我们的例子中,我们希望使用 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

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

于 2021-02-05T15:50:22.287 回答
1

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

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

于 2019-06-07T02:19:07.243 回答
0

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

问候

于 2020-09-14T19:50:42.697 回答