用户'DOMAIN\MACHINENAME $'登录失败

Sve*_*ang 115 .net sql-server iis-6 web-applications sql-server-2005

我知道这几乎是重复的:错误"登录失败,用户NT AUTHORITY\IUSR""在ASP.NET和SQL Server 2008用户登录失败"用户名" -在外部System.Data.SqlClient.SqlException与LINQ项目/类库但有些东西与我服务器上的其他应用程序相比并没有加起来,我不知道为什么.

正在使用的盒子:

Web Box
SQL框
SQL测试框

我的应用程序:

我有一个ASP.NET Web应用程序,它引用了一个使用LINQ-to-SQL的类库.连接字符串在类库中正确设置.按照在外部项目/类库System.Data.SqlClient.SqlException与LINQ -用户登录失败"用户名"我还添加了此连接字符串的Web应用程序.

连接字符串使用SQL凭据(在Web应用程序和类库中):

 <add name="Namespace.My.MySettings.ConnectionStringProduction"
        connectionString="Data Source=(SQL Test Box);Initial Catalog=(db name);Persist Security Info=True;User ID=ID;Password=Password"
        providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)

此连接通过将其添加到服务器资源管理器确认为正常工作.这是我的.dbml文件正在使用的连接字符串.

问题:

我收到以下错误:

System.Data.SqlClient.SqlException: Login failed for user 'DOMAIN\MACHINENAME$'.
Run Code Online (Sandbox Code Playgroud)

现在引用ASP.NET和SQL Server 2008中的错误"登录失败的用户'NT AUTHORITY\IUSR'"它说真的是本地网络服务并且使用任何其他非域名都不起作用.

但我很困惑,因为我检查了SQL Box和SQL Test Box SQL Management Studio,并且都NT AUTHORITY/NETWORK SERVICE在安全 - >登录,在数据库级别,未列在安全 - >用户下,但在数据库级别安全 - >用户我将用户显示在连接字符串中.

在Web服务器上的NTFS级别,权限使NETWORK SERVICE具有完全控制权.

我之所以感到困惑,是因为我的Web服务器上有许多其他Web应用程序,它们在SQL Box和SQL Test Box上引用数据库,它们都可以工作.但除了我使用类库之外,我找不到它们和我当前的应用程序之间的区别.那会有关系吗?检查NTFS权限,服务器和数据库级别的安全登录设置,连接字符串和连接方法(SQL Server凭据)以及IIS应用程序池和其他文件夹选项都是相同的.

为什么这些应用程序在没有将machinename $添加到我的任何一个SQL框的权限的情况下工作?但这就是一个链接告诉我要解决这个问题的方法.

Rem*_*anu 150

NETWORK SERVICE和LocalSystem将始终作为本地的相应帐户(内置\网络服务和内置\系统)进行身份验证,但两者都将远程验证为计算机帐户.

如果您发现类似故障Login failed for user 'DOMAIN\MACHINENAME$'意味着作为NETWORK SERVICE或LocalSystem运行的进程已访问远程资源,则已将自身身份验证为计算机帐户并被拒绝授权.

典型示例是在应用程序池中运行的ASP应用程序,该应用程序池集使用NETWORK SERVICE凭据并连接到远程SQL Server:应用程序池将作为运行应用程序池的计算机进行身份验证,并且此机器帐户需要被授予访问权限.

当拒绝访问计算机帐户时,必须授予计算机帐户访问权限.如果服务器拒绝登录"DOMAIN\MACHINE $",则必须将"DOMAIN\MACHINE $"的登录权限授予NETWORK SERVICE.授予对NETWORK SERVICE的访问权限将允许作为NETWORK SERVICE运行的本地进程连接,而不是远程连接,因为远程的进程将验证为DOMAIN\MACHINE $.

如果您希望asp应用程序作为SQL登录连接到远程SQL Server,并且您获得有关DOMAIN\MACHINE $的例外,则表示您在连接字符串中使用Integrated Security.如果这是意外的,则意味着您搞砸了所使用的连接字符串.

  • 对了,我所收集的东西,谢谢您的解释。但是,问题仍然存在,我所有的应用程序都托管在Web服务器上,但是可以通过SQL或SQL Test Box访问数据库,那将是远程访问吗?但是它们正在工作...但是我的SQL框均未授予DOMAIN \ MACHINENAME $访问权限。 (2认同)
  • 有三种可能的解释:1)他们使用SQL auth而不是集成的auth(这似乎是最合理的,因为你的例子在conn字符串中有一个用户ID和密码)2)他们使用集成的auth并在app poll中运行使用不同的凭证或3)他们使用集成的身份验证,但ASP应用程序模拟调用者,从而触发约束委派:http://technet.microsoft.com/en-us/library/cc739587%28WS.10%29.aspx . (2认同)
  • 您的Web应用程序项目应该引用类库*项目*,而不是dll.将类库项目添加到Web应用程序解决方案,然后删除对dll的引用并添加对项目的引用.这样,在部署或测试时,零售Web应用程序将引用零售类dll,debug将自动引用debug. (2认同)

Zai*_*Ali 30

使用IIS配置应用程序时出现此错误,并且IIS转到SQL Server并尝试使用没有适当权限的凭据登录.设置复制或镜像时也会发生此错误.我将讨论一个始终有效且非常简单的解决方案.转到SQL Server >>安全>>登录,右键单击NT AUTHORITY\NETWORK SERVICE并选择属性

在新打开的"登录属性"屏幕中,转到"用户映射"选项卡.然后,在"用户映射"选项卡上,选择所需的数据库 - 尤其是显示此错误消息的数据库.在下部屏幕上,检查角色db_owner.单击确定.

  • 这是我的解决方案,因为Web应用程序和数据库位于同一台机器上.我仍然收到错误"登录失败的用户'DOMAIN\MACHINENAME $"但是将机器添加到SQL登录没有帮助,但添加了"NT AUTHORITY\NETWORK SERVICE".虽然除非需要,否则不应使用db_owner角色,但通常db_datareader和db_datawriter就足够了. (7认同)

nZe*_*eus 16

在我的情况下,我有Identity="ApplicationPoolIdentity"我的IIS应用程序池.

我将IIS APPPOOL\ApplicationName用户添加到SQL Server之后就可以了.

  • 我相信这只有在IIS和SQL服务器位于同一台机器上时才有效. (5认同)

小智 12

对我有用的技巧是Integrated Security从我的连接字符串中删除并User ID=userName; Password=passwordApp.config你的libruary中添加一个常规的连接字符串可能没有使用集成安全性,但创建的Web.config是!

  • 十亿谢谢你.巨大的,巨大的帮助.谢谢你,谢谢你,谢谢你.我确信这是非常明显的,但是对于未来的人来说,这是用户ID =某事; 密码=东西; (3认同)
  • 我在帖子的标题中得到了同样的错误.我发现当''trusted connection = true'"在数据库连接字符串中时,将忽略'User Id = yourUserid Password = yourPassword'.我从我的字符串中删除了"'trusted connection = true'",这解决了我的问题.直到我将应用程序从VS 2012中的调试移动到iis 8之后才发生这种情况. (2认同)

小智 11

一位同事有同样的错误,这是由于IIS中的一点配置错误.
为Web应用程序分配了错误的应用程序池.

实际上,我们使用具有特定身份的自定义应用程序池来满足我们的需求.

在他的本地IIS管理器 - >站点 - >默认网站 - >我们的Web应用程序名称 - >基本设置...应用程序池是"DefaultAppPool"而不是我们的自定义应用程序池.

设置正确的应用程序池解决了问题.


Raj*_*ral 11

基本上解决这个问题我们需要设置一些像

  • 在ApplicationPoolIdentity下运行的Web应用程序
  • Web应用程序使用连接字符串中的Windows身份验证通过ADO.Net连接到数据库

使用Windows验证的连接字符串包含任何Trusted_Connection=Yes属性或属性等同Integrated Security=SSPIWeb.config文件

我的数据库连接处于Windows身份验证模式.所以我通过简单地将Application Pools Identity从ApplicationPoolIdentity更改为我的域登录凭据DomainName\MyloginId来解决它

步:

  1. 单击" 应用程序池"
  2. 选择应用程序的名称

  3. 转到高级设置

  4. 展开Process Model并单击Identity.单击右端的三个点.
  5. 单击" 设置..."按钮并提供域登录凭据

对我来说它已经解决了.

注意:在生产环境或IT环境中,您可能在应用程序池标识的同一域下拥有服务帐户.如果是这样,请使用服务帐户而不是登录.


小智 10

我添加<identity impersonate="true" />到我的web.config,它工作正常.

  • 只需理解这将改变ASP.NET应用程序完整运行的上下文.它现在将在使用应用程序的用户的上下文(即Domain\someUser)下运行,而不是在默认的"NETWORK SERVICE"上下文中运行.有时这是可以的,但是要理解这种变化不仅仅是对OP的快速修复,而且还有其他可能/可能不需要的下游含义. (7认同)

Ars*_*yan 6

DefaultApplicationPool对于我来说,通过将Identity设置为 来修复“DOMAIN\MACHINENAME$”问题NetworkService

在此输入图像描述


小智 5

对我来说,当我用一个允许访问数据库的网络帐户替换默认的内置帐户"ApplicationPoolIdentity"时问题得到了解决.

可以在Internet Information Server(IIS 7+)>应用程序池> Advanded Settings> Process Model> Identity中进行设置