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

最近开始一直没有问题的应用程序(在大约6个月左右没有进行任何积极的开发)开始无法连接到数据库。 操作pipe理员不能说什么可能会导致问题的变化。

客户端应用程序使用集成安全性= True的硬编码连接string,但是当应用程序试图创build到数据库的连接时,它会抛出一个SQLException,指出“用户login失败”NT AUTHORITY \ ANONYMOUS LOGON。

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

编辑

客户机和服务器机器以及用户帐户在同一个域中。 这是在Windows防火墙closures时发生的。

主要理论是:服务器在大约一周前重启,未能注册服务主体名称(Service Principal Name,SPN)。 未能注册SPN可能会导致集成身份validation返回到NTLM而不是Kerberos。

如果你的问题是链接服务器,你需要看几件事情。

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

其次,您的服务帐户必须信任委派。 既然你接受改变你的服务帐户,我怀疑这是罪魁祸首。 ( http://technet.microsoft.com/en-us/library/cc739474(v=ws.10).aspx )

你提到你可能有一些SPN问题,所以一定要为这两个端点设置SPN,否则你将无法看到AD中的委派标签。 另外请确保您在“Active Directory用户和计算机”中处于高级视图。

如果您仍然没有看到委派选项卡,即使在更正您的SPN后,请确保您的域不在2000模式。 如果是这样,你可以“提升域名function级别”。

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

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

单击委派选项卡,select该帐户可信代表checkbox,然后单击确定。

最后,您还需要将所有机器设置为可信委托。

一旦你这样做了,重新连接到你的SQL服务器,并testing你喜欢的服务器。 他们应该工作。

首先:我的问题是不是完全一样的,但这篇文章是第一件事,谷歌的Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'错误在我写这个时候。 该解决scheme可能对search此错误的用户有用,因为我没有在任何地方在线find此特定解决scheme。

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

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

总而言之,在我们的例子中Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'似乎是由于服务没有运行和/或不在正确的用户Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'造成的。 确保正确的SPN或其他服务在正确的用户下运行应该解决问题的匿名部分。

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

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

在您的scheme中,客户端必须进行tcp连接,并且很可能在LocalSystem帐户下运行,并且没有为SQL实例注册SPN,因此使用NTLM,但是LocalSystem帐户从系统上下文inheritance而不是真实用户因此,作为“匿名login”失败。

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

我的一个SQL作业有同样的问题。 它涉及从一台服务器上传数据到另一台服务器。 发生错误,因为我正在使用SQL Server代理服务帐户。 我使用所有服务器通用的UserId(使用Windowvalidation)创build了一个Credential。 然后使用此凭据创build一个代理。 在sql server作业中使用代理,它运行正常。

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