12

当我尝试访问我新部署的(到 lcoal IIS 7.5)MVC4 应用程序时,我收到错误消息:

用户 'DOMAIN\MACHINE-NAME$' 登录失败

其中“$”是附加的,而不是机器名称的一部分。

web.config 中的连接字符串如下所示:

<add name="ComairRIEntities"
     connectionString="metadata=res://*/Data.ComairRI.csdl|res://*/Data.ComairRI.ssdl|res://*/Data.ComairRI.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(local);initial catalog=MyDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;"
     providerName="System.Data.EntityClient" />
4

9 回答 9

10

这是正在发生的事情:

在您的连接字符串中,您有以下设置:integrated security=True 这意味着 SQL Server 连接将使用启动连接的进程的凭据进行身份验证。由于您在 IIS 下运行并且 IIS 使用应用程序池,因此连接将通过运行应用程序池的 Windows 用户进行身份验证。默认情况下,这是一个几乎没有权限的用户,称为 NetworkService。NetworkService(或者在 IIS7.5 中可能是不同的)永远不会拥有对您的数据库的访问权限。您的特定场景的细微差别可能会有所不同,因为 IIS 中有一堆不同的安全继承,并且您的进程可能最终会出现一堆不同的用户,但是,基本问题是您有Integrated security=True并且运行 IIS 进程的用户是几乎没有权限的标准用户。

要解决此问题,您有几个选择:

  1. 将 Integrated security=True 更改为 username\password 身份验证。这将 100% 解决,但您可能不想将密码明文存储在 web.config 文件中。
  2. 在您的 IIS 虚拟目录设置中,将匿名用户配置为对您的数据库具有访问权限的有意义的用户。这最终会有所帮助,但您必须使用不同的设置才能正确设置。

如果您需要关于 #2 的更多帮助,您必须提供以下信息:

  1. AppPool 的身份
  2. 虚拟目录的身份和虚拟目录的所有身份验证设置。
于 2013-03-01T06:39:01.417 回答
3

这个问题有很多很好的信息:Login failed for user 'DOMAIN\MACHINENAME$'

如果您看到用户 'DOMAIN\MACHINENAME$' 的登录失败,这意味着作为 NETWORK SERVICE 或 LocalSystem 运行的进程访问了远程资源,已将自己验证为机器帐户并被拒绝授权。

这里看起来很奇怪的是您仍在尝试访问本地数据库,但用户名DOMAIN\MACHINENAME$暗示它正在访问非本地数据库。

您确定您发布的连接字符串实际上是使用的连接字符串吗?

您可以考虑做的另一件事是为您的站点运行的应用程序池创建一个特定的用户帐户 - 它很可能需要读取和写入权限。

用户帐户的类型将取决于您的环境:如果您在域中运行,您可以创建一个域用户并继续integrated security=True在您的连接字符串中使用,或者如果不是,您可以使用 SQL 身份验证进行调查。

编辑:

我曾经遇到过这个确切的错误,做几乎完全相同的事情。在我的情况下,数据库位于单独的服务器上(即,与您的情况不同的机器),但解决方案是:

  1. 创建域帐户。
  2. 将其添加到 SQL Management Studio 中的 Security\Logins and Security\Users。
  3. 在 SQL Management Studio 中为其提供角色成员db_datareader身份。db_datawriter
  4. 在 Web 服务器上,运行aspnet_regiis -ga domain\account_name
  5. 将此帐户设置为用于匿名访问的帐户。
  6. 为此 Web 应用程序创建一个新的应用程序池。
  7. 将应用程序池的标识设置为该帐户。

请注意,这是针对 IIS 6 的,因此如果您使用的是 IIS 7+,则可能不需要步骤 4、5 和 6。

于 2013-02-22T09:28:05.633 回答
2

需要注意的一件事是DOMAIN\MACHINE-NAME$用于表示域上机器凭据的语法。与您拥有用户帐户的方式类似,还有一个几乎相同的机器帐户(除了权限显着不同)。

既然你得到DOMAIN\MACHINE-NAME$你没有模仿问题。首先要做的是查看应用程序池以查看它以什么身份运行。

您可以通过打开 IIS 管理器并选择应用程序池来执行此操作。接下来选择应用程序池并单击右侧的“查看应用程序”,这使您可以验证所有设置是否正确。

如果配置正确然后单击“高级设置...”,在“流程模型”标题下有一个“身份”字段,它应该是以下之一:

  • 应用程序池身份
  • 本地服务
  • 本地系统
  • 网络服务
  • 域\帐户

如果它是 ApplicationPoolIdentity 它是按照您的预期设置的,如果它是非自定义的,否则您可能会得到DOMAIN\MACHINE-NAME$您所体验的。自定义帐户是值得怀疑的,因为它会显示为该帐户。

如果它是 ApplicationPoolIdentity 并且 SQL 机器不在同一台机器上(或者可能如果您使用主机名或 IP 地址),您可能会得到DOMAIN\MACHINE-NAME$,因为那是 ApplicationPoolIdentity 的网络凭据。ApplicationPoolIdentityIIS AppPool\ApplicationPool用于本地访问,但DOMAIN\MACHINE-NAME$用于远程访问,因为前者仅在本地可用。

还要确保您实际上使用的是确切的连接字符串,因为我在上面详细介绍了访问方法很重要的原因。

如果这不能解决它,如果您详细说明您设置的身份以及是否启用了 ASP.Net 模拟,将会有所帮助。

于 2013-02-28T20:57:05.217 回答
1

你确定这个位需要有"吗?

  provider connection string=&quot

它不应该像字符串的其余部分一样只是一个引号吗?

字符串的末尾也有一个。

于 2013-02-14T09:41:06.060 回答
1

这是应用程序池标识在连接到 SQL Server 时显示的本地用户帐户。尝试更改应用程序池以使用网络服务并向您的数据库授予网络服务权限,或授予IUSR_YOUR-MACHINE数据库权限。当您在本地工作时,将网络服务 db_owner 设置为本地数据库可能会更容易。显然,在生产中这样做存在安全问题!

于 2013-02-22T09:16:54.387 回答
1

检查您的应用程序的 AppPool 在 IIS 管理器中运行的标识。它可能是 AppPoolIdentity。然后检查您是否已在 SQL Server 中为该身份创建了一个登录名,它是否已映射到您的数据库,并且它是否具有应用程序所需的必要角色成员资格/权限。身份名称将为“IIS AppPool\[AppPoolName]”。(有关更多信息,请参阅http://www.iis.net/learn/manage/configuring-security/application-pool-identities)。

如果这不起作用,请说明您配置应用程序数据库连接的方式,包括是否启用了模拟。

于 2013-02-25T18:49:18.663 回答
1

我将回顾以下内容。

而不是“数据源=(本地)”使用数据库所在的计算机名称。检查 DNS 解析以确保名称正确。

确保运行应用程序池的用户有权连接到数据库服务器。

于 2013-03-01T03:41:33.203 回答
1

您需要将应用程序池身份添加到 sql server 作为登录名。阅读: http ://www.iis.net/learn/manage/configuring-security/application-pool-identities-and-sql-server-express

于 2013-03-01T05:21:31.950 回答
0

只需转到 IIS 并创建一个新的应用程序池或更改当前的应用程序池。转到应用程序池的高级设置。在流程模型下,将身份更改为您要使用的用户,默认值为ApplicationPoolIdentity。然后转到您在 IIS 中的网站设置,选择基本设置并更改为新创建的应用程序池(如果已创建)。

  1. 应用程序池=>高级设置=>更改身份
  2. 站点=>默认网站=>您的站点=>基本设置=>如果不同则更改应用程序池
于 2018-11-20T12:08:47.243 回答