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

Cod*_*ior 62 sql-server security sqlconnection

最近开始无法连接到数据库的应用程序一直没有问题(并且在大约6个月左右没有对其进行任何活动开发).操作管理员无法说出可能导致问题的更改内容.

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

我可以通过此帐户上的Management Studio登录数据库而不会出现问题.我在这个问题上看到的所有内容都是针对ASP.NET项目的,显然它是"双跳问题",它是一个客户端应用程序,最好不要成为问题.任何帮助将不胜感激.

编辑

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

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

Cod*_*ian 23

如果您的问题在于链接服务器,则需要查看一些内容.

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

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

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

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

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

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

单击"委派"选项卡,选中"委派信任的帐户"复选框,然后单击"确定".

最后,您还需要将所有计算机设置为委托信任.

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

  • 很好的答案.我挂回这从一个更近的问题在这里,这里的情况是不同的,但症状和根本原因都是相同的:/sf/ask/3351027151/ -script-其中-具有数据库连接-使用集成的 - 窗口A/47877987#47877987 (3认同)
  • 对计算机设备本身(不仅仅是服务帐户)上的委派配置进行特别投票。大多数其他帖子都忽略了这一点。 (2认同)

Cab*_*etp 6

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

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

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

总而言之,Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'我们两种情况下的错误似乎都是由于服务没有运行和/或没有在正确的用户上引起的.确保正确的SPN或其他服务正在运行,并且在正确的用户下应该解决问题的匿名部分.

  • 我已经回答了这个问题,所以我认为这对谷歌搜索的人有帮助.许多其他论坛都有类似问题的帖子链接到这篇文章得到关于它是否实际帮助的混合回答,所以我试图帮助解决它们,即添加相关信息和可能的解决方案而不是请求帮助. (6认同)

Sau*_*R S 5

我认为用于对数据库进行身份验证的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"失败了.

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


小智 5

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