SQL Server 在 Windows 应用程序中返回错误"Login failed for user 'NT AUTHORITYANONYMOUS LOGON'."



一个运行正常的应用程序(在大约6个月左右的时间里没有对其进行任何主动开发)最近开始无法连接到数据库。操作管理员无法说明可能发生了哪些更改,从而导致问题。

客户端应用程序使用集成安全性为True的硬编码连接字符串,但当应用程序尝试创建与数据库的连接时,它会抛出一个SQLException,称为"用户'NT AUTHORITY\ANONYMOUS LOGON登录失败"。

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

编辑

客户端计算机和服务器计算机以及用户帐户位于同一域上。当Windows防火墙关闭时会发生这种情况。

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

如果您的问题与链接服务器有关,那么您需要了解以下几点。

首先,你的用户需要启用委派,如果唯一改变的是他们可能会这样做。否则,你可以取消选中"帐户是敏感的,不能委派"复选框,这是AD中的用户属性。

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

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

如果您仍然看不到委派选项卡,即使在更正SPN之后,请确保您的域未处于2000模式。如果是,您可以"提高域功能级别">

此时,您可以将该帐户标记为可信任委派:

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

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

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

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

首先:我的问题和你的问题不完全一样,但这篇文章是我写这篇文章时,谷歌上出现的第一个Login failed for user 'NT AUTHORITYANONYMOUS LOGON'错误。该解决方案可能对搜索此错误的人有用,因为我在网上找不到这个特定的解决方案。

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

这是它与你的问题不同的地方。本地网络上的任何计算机都不在域上,它们只在工作组上。要在工作组中使用Windows身份验证,带有服务器的计算机(在我的情况下是MSSQL server)和带有请求数据的服务的计算机(在此情况下是Apache)都需要有一个具有相同名称和相同密码的用户。

总之,在我们的两种情况下,Login failed for user 'NT AUTHORITYANONYMOUS LOGON'错误似乎是由服务未运行和/或未在正确的用户上引起的。确保正确的SPN或其他服务正在运行并且在正确的用户下运行,应该可以解决问题的匿名部分。

我认为用于对数据库进行身份验证的AD组中一定有一些更改。将web服务器名称(格式为domain\webservername$)添加到有权访问数据库的AD组中。此外,还可以尝试将web.config属性设置为"false"。希望能有所帮助。

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

在您的场景中,客户端必须进行tcp连接,并且它很可能在LocalSystem帐户下运行,并且没有为SQL实例注册SPN,因此使用NTLM,但是,LocalSystem帐户继承自系统上下文,而不是真正的基于用户的上下文,因此,失败为"ANONYMOUS LOGON"。

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

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

尝试在连接字符串中设置"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"/>

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

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

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

解决了一个类似的案例:

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

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

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

当然,我们在匿名登录方面有这些错误。

只需进入应用程序池,在Advance Setting中选择Process model,然后选择Identity,并在Identity中设置您的帐户详细信息,如系统的用户名和密码。

明白了!解决了在SQL Server的安全会话中修改用户属性的问题。在SQL Server管理中,进入安全性->登录->选择用于数据库连接的用户并进入其属性。转到";Securators";tab并查找行";连接SQL";,标记";Grant";选择并尝试。它对我有用!

问候

最新更新