用户“ IIS APPPOOL \ ASP.NET v4.0”的登录失败


432

我有一个Web项目(C#Asp.Net,EF 4,MS SQL 2008和IIS 7),我需要将其本地迁移到IIS 7(目前可在CASSINI上正常运行)。

我在IIS本地进行Default Web Site部署。我的部署和部署Default Web Site都在ASP.NET v4.0池中(针对设置请看图片),将池目标Framework 4作为我的Web项目。 泳池设置 当访问该站点时,浏览器不显示页面,而是允许浏览器下载页面。

我还有其他在IIS上本地运行的项目,它们没有任何问题(但是它们不使用实体框架)。

使用事件记录器,我看到如下错误:

Exception information: 
    Exception type: EntityException 
    Exception message: The underlying provider failed on Open.
   at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)


    Login failed for user 'IIS APPPOOL\ASP.NET v4.0'.
       at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
       at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
       at System.Data.SqlClient.SqlConnection.Open()
       at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)

相关问题

更新:您可以在有关此问题的资源中阅读到,必须在MS SQL 2008上手动授予权限,这是他回答中的解释。使用IIS 7.5和MS SQL 2008 R2,不需要手动设置权限。


2
您是否允许网站文件夹上的应用程序池标识权限?
基督教徒

我不确定,请告诉我该怎么做?
GibboK 2011年


实际上,正如adrift所说,这可能是sql安全问题。最好为AppPool设置一个NT用户帐户,然后将该权限授予网站文件夹和SQL中的适当表
Christian Christian

1
@GibboK:我鼓励您在这里查看已接受的答案,并选择一个更合适的答案。公认的答案导致许多人陷入安全黑洞。是的,它有效。不,这确实不是一个好主意。请在下面查看我的评论。
支出者2014年

Answers:


595

似乎尝试打开与SQL Server的连接失败。

您需要向SQL Server添加登录名IIS APPPOOL\ASP.NET v4.0并授予数据库权限。

在SSMS中,在服务器下,展开“安全性”,然后右键单击“登录名”并选择“新登录名...”。

在“新建登录名”对话框中,输入应用程序池作为登录名,然后单击“确定”。

在此处输入图片说明

然后,您可以右键单击应用程序池的登录名,选择“属性”,然后选择“用户映射”。检查适当的数据库和适当的角色。我认为您可以只选择db_datareaderdb_datawriter,但是如果您通过EF执行存储过程,则仍需要授予执行存储过程的权限。您可以在此处查看角色的详细信息。


8
谢谢,我做了您可悲的事情,现在我收到此错误:无法打开登录请求的数据库“ SiteNameExtension”。登录失败。用户“ IIS APPPOOL \ DefaultAppPool”的登录失败。
GibboK,2011年

76
非常重要:请勿单击搜索尝试确认登录!它不会识别它,但是会起作用。只需将其键入为IIS APPPOOL \ SimonsAppPoolName。看到这个stackoverflow.com/questions/1933134
Simon_Weaver

6
最好将其从IIS的“标识”更改为“ LocalSystem”,如下一个答案所述。
Altaf Patel 2014年

当您的SQL Server实例位于IIS主机之外的另一台主机上时,此功能可以工作吗?因为我需要修复相同的问题,但是SQL和IIS不在同一台计算机上。因此,对于新用户使用Windows身份验证将无法正常工作
Segers-Ian 2014年

5
对我来说,用户要添加的是“ IIS APPPOOL \ DefaultAppPool”。然后它起作用了。
马塞尔(Marcel)

343

您可以从IIS7->应用程序池->高级设置更改ApplicationPoolIdentity。 高级设置

在ApplicationPoolIdentity下,您将找到本地系统。这将使您的应用程序在下运行NT AUTHORITY\SYSTEM,默认情况下,这是数据库的现有登录名。

编辑:在应用此建议之前,您应该注意并了解安全隐患。


51
@GibboK,如果您担心安全性,请不要这样做。请参阅technet.microsoft.com/zh-cn/library/dd378907(v=WS.10).aspx
Jeff Ogata

4
除了以本地系统身份运行应用程序池外,我还必须将“ NT AUTHORITY \ SYSTEM”用户映射到数据库角色
Phil,

31
这太臭了。向Web应用程序授予SYSTEM权限是灾难的根源,并且允许不法行为各种各样的机会不仅对您的Web应用程序而且对整个托管服务器造成不良后果。仅仅因为数据库接受来自SYSTEM的登录并不意味着您应该将Web应用程序作为SYSTEM运行。Windows桌面甚至不让您以SYSTEM身份运行(不跳箍)。以这种权限运行Webapp是一个非常非常愚蠢的想法。您应该使数据库接受当前的apppool身份。如果可以的话,我会加-100。-1。
支出者2014年

8
SYSTEM比管理员具有更高的特权。您切勿在任何达到该级别的条件下运行Web服务器。
slugster 2014年

1
我只是使Guest帐户成为管理员组的成员。简单,干净,绝对不会对安全废话造成任何影响。

29

确保你有...

Trusted_Connection=false;

在您的连接字符串中


7
连接字符串中具有Trusted_Connection = true时,将使用IIS身份用户配置文件覆盖SQL身份验证值。
杰夫熊

2
在我的情况下,从连接字符串中删除:Integrated Security = True修复了该问题。
卡洛斯·R·巴尔波纳

为我工作。@JefftheBear拯救了一天
D_Edet

26

我使用sql解决了这个问题,如下图。

右键单击db->属性->权限-> View Server权限->,然后选择IIS APPPOOL\ASP.NET v4.0并授予权限。

D b


您是否在描述上述针对该应用程序池标识的授予服务器级别权限的过程(和图像)?听起来不是个好主意。
克里斯·沃尔什

2
该用户值得获得奖牌!没什么,但这!
Khateeb321

2
@ Khateeb321绝对,非常感谢DevT的回答。
Azxdreuwa

22

运行这个SQL脚本

IF NOT EXISTS (SELECT name FROM sys.server_principals WHERE name = 'IIS APPPOOL\DefaultAppPool')
BEGIN
    CREATE LOGIN [IIS APPPOOL\DefaultAppPool] 
      FROM WINDOWS WITH DEFAULT_DATABASE=[master], 
      DEFAULT_LANGUAGE=[us_english]
END
GO
CREATE USER [WebDatabaseUser] 
  FOR LOGIN [IIS APPPOOL\DefaultAppPool]
GO
EXEC sp_addrolemember 'db_owner', 'WebDatabaseUser'
GO

谢谢,最简单的方法;)+1
Zolfaghari

11

如果在连接字符串中指定了:

User ID=xxx;Password=yyy

但是在连接字符串中有:

Trusted_Connection=true;

SQL Server将使用Windows身份验证,因此您的连接值将被忽略和覆盖(IIS将使用在身份用户配置文件中指定的Windows帐户)。 更多信息在这里

如果连接字符串中包含以下内容,则同样适用:

 Integrated Security = true;

要么

 Integrated Security = SSPI;

因为Windows身份验证将用于连接到数据库服务器。 更多信息在这里


10

转到IIS->应用程序池->查找应用程序中使用的应用程序池

在此处输入图片说明

选择用于该应用程序的应用程序池,右键单击选择高级设置

在此处输入图片说明

选择应用程序池标识 在此处输入图片说明

选择内置为本地系统,然后单击确定


7

我讨厌ApplicationPoolIdentity。我总是将Windows用户帐户设置为AppPools上的帐户。

正如adrift所说,这听起来确实像是数据库安全问题。因此,创建一个NT用户帐户,将其分配给ASP.NET v4.0 AppPool,然后将其授予网站文件夹和SQL中相关表的权限。


抱歉,不知道该怎么做,可以给我指出一个教程吗?感谢您对此的帮助
GibboK 2011年

2
不要这样做,这是IIS更改了应用程序池标识的原因,learn.iis.net
page.aspx / 624 /

@ LeSnip3R断链
Adaptabi

6

不要使用集成安全性。采用User Id=yourUser; pwd=yourPwd;

这样就解决了问题。


4

我遇到了这个问题,实际上是由其他原因引起的-我的数据库中有“ IIS APPPOOL \ ASP.NET v4.0”用户,但仍然无法正常工作。

我最近升级了SQL Server安装程序,并且在此过程中,用户已与登录断开连接-因此在数据库->安全->用户下有一个'IIS APPPOOL \ ASP.NET v4.0',但没有用户不在安全下->登录。

将登录名“ IIS APPPOOL \ ASP.NET v4.0”添加到“安全性”->“登录名”中,SQL Server自动将其映射到数据库中的用户(此操作以前必须手动完成),并已解决问题。


1
只需在左侧的Permissions下添加...,在db_writer和db_reader中打勾;并选择将利用这些权限的数据库。
benjieb

4

您需要清除的第一件事是,如果使用的是Windows身份验证,并且在连接字符串中未提及任何用户名密码,则:

通过本地主机运行代码时会发生什么:当从本地主机运行wcf测试客户端时,它将在本地调试模式应用程序通过您的帐户服务调用数据库时与数据库进行通信。因此它可以访问数据库,因为devenv.exe在您的用户帐户下运行。

但是,当您在IIS中部署Web服务时。现在了解此服务在IIS而不是您的帐户下运行。因此,您需要为IIS服务分配访问权限,以访问用于Windows身份验证的sql服务器。由于访问权限问题和用户登录失败,您的Web服务将无法与SQL Server通信_______(您的用户将来到这里)

因此,如果您使用Windows身份验证来连接数据库,则只需更改IIS应用程序池设置。您需要将IIS应用程序池的标识更改为本地系统。

以下是Windows身份验证WCF的步骤:

1)打开IIS(Windows + R(运行),然后键入inetmgr,然后单击“确定”)

2)在“连接”下双击您的PC名称

3)单击应用程序池

4)选择您的应用程序池(DefaultAppPool)

5)然后在右侧的操作下,单击高级设置:

6)转到流程模型部分,然后

7)点击身份。

8)现在选择LocalSystem。

现在打开您的SQL Server Management Studio:打开run->,然后键入ssms->然后按ok。在ssms中,使用Windows身份验证帐户登录。打开安全选项卡,展开登录选项卡,然后就可以查看您的帐户了。

现在,您的帐户的打开属性转到userMapping,然后选择要连接的数据库,然后检查要用于所选数据库的角色成员资格服务。单击确定。

(对于网络服务,即Intranet用户,您也需要为NT AUTHORITY \ SYSTEM用户配置以上设置)

添加Trusted_Connection = True; 连接字符串中的属性。保存并部署Web服务。重新启动应用程序池。

您现在可以连接数据库。


完善!LocalSystem为我解决了此问题:)
极权主义的

3

我收到此消息,并且在Web服务器上使用Windows身份验证。

我希望针对数据库对当前经过身份验证的Web用户进行身份验证,而不是使用在“应用程序池”中指定的IIS APPPOOL \ ASP.NET v4用户。

通过在web.config中输入以下内容,我发现此问题已为我解决:

<system.web>
  <identity impersonate="true" />
</system.web>

https://msdn.microsoft.com/zh-CN/library/bsz5788z.aspx

我看到有关在SQL DB中创建AppPool用户名或仅使用SQL Auth的其他答案。如果您不想在SQL中捕获或保护单个Windows用户,则两者都是正确的。

汤姆


这为我们解决了这个问题,我们不确定为什么。IIS / AppPool只是劫持了明确显示“ Integrated Security = true”的连接字符串?为什么??
盖伊,

3

1_in SqlServer安全=>登录=> NT AUTHORITY \ SYSTEM => RightClick => Property => UserMaping => Select YourDatabse => Public && Owner Select => OK 2_In IIs Application Pools DefaultAppPool => Advance Setting => Identity => LocalSystem => Ok


2

设置身份仅会使这项工作在我的页面中进行。


2

启动Visual Studio应用程序时,Cassini将以您自己的用户身份运行您的网站。IIS将您的网站作为应用程序池标识运行。除非授予应用程序池标识对数据库的访问权限,否则您将获得错误。

IIS引入了“应用程序池标识”以提高安全性。您可以在默认的“应用程序池标识”下运行网站,或者使用自己的名称创建新的应用程序池,或者使用在用户帐户(通常是域帐户)下运行的具有自己的名称的新应用程序池。

在网络情况下(不在Azure中),可以使新的应用程序池在Active Directory域用户帐户下运行;与计算机帐户相比,我更喜欢此帐户。这样做可以提供精细的安全性和对包括数据库在内的网络资源的精细访问。每个网站都在不同的应用程序池上运行(每个网站均以其自己的域用户帐户运行)。

在所有连接字符串中继续使用Windows Integrated Security。在SQL Server中,将“域”用户添加为登录名,并在每个网站的基础上授予对数据库,表,SP等的权限。例如,Website1使用的DB1具有User1的登录名,因为Website1在App Pool上以User1身份运行。

从Visual Studio内置DB(例如LocalDB)和内置Web Server部署到生产环境的一个挑战来自以下事实:开发人员的用户SID及其ACL不能在安全的生产环境中使用。Microsoft提供了用于部署的工具。但是可怜可怜的开发人员,他们习惯了新的简单VS IDE中带有localDB和localWebServer的开箱即用的功能,因为这些工具对于该开发人员将很难使用,尤其是对于缺少SysAdmin和DBAdmin支持或他们的专业知识。但是,部署到Azure比上面提到的企业网络情况更容易。


2

如果在web.config中添加了连接字符串,请确保“ Integrated Security = false;”。因此它将使用在web.config中指定的ID和密码。

<connectionStrings>
    <add providerName="System.Data.SqlClient" name="MyDbContext" connectionString="Data Source=localhost,1433;Initial Catalog=MyDatabase;user id=MyUserName;Password=MyPassword;Trusted_Connection=true;Integrated Security=false;" />
</connectionStrings>

2

如前所述,不要使用Windows身份验证,请使用SQL Server身份验证

另外,如果您使用“服务器连接”对话框创建了连接,请确保检查web.config中的连接。您可能已创建/修改了连接,并且该连接已作为可信连接存储在web.config中。只需使用此身份验证

<add name="MyDBConnectionString" connectionString="Data Source=localhost;Initial Catalog=Finantial;User ID=xxx;Password=xxx" providerName="System.Data.SqlClient"/>

这应该修复错误。


2

为用户授予数据库权限的另一种方法IIS APPPOOL\ASP.NET v4.0如下。
在此处输入图片说明


  1. IIS APPPOOL\ASP.NET v4.0使用默认模式添加具有用户名和登录名的新用户。
  2. 转到所有者架构和成员身份,检查db_datareader,db_datawriter

1

以为我会将其发布为答案,因为它与问题相关,并且在某些情况下可以回答。

如果数据库不存在,也会出现相同的消息

确保您的连接字符串没有拼写错误,指向正确的服务器实例等。


1

我有同样的问题我解决它通过改变Integrated Security=True虚假 现在它的工作



0

您做了什么@Teddy建议,仍然遇到相同的错误?

确保更改的是与虚拟目录而不是父服务器相对应的应用程序池的设置。每个虚拟目录都有其自己的AppPool,并且不会继承。


0

在DefaultAppPool中,在Identity属性中设置NetworkService,然后在Sql Server中,添加User Network Service并为其授予对数据库的适当权限,这对我来说非常有效,我已经在本地进行了测试,但是我认为这是从任何位置进行连接的最佳配置网络中的其他计算机。当您在IIS的“身份”中设置LocalSystem时,效果很好,并且没有必要在Sql Server中创建任何其他用户,但是我认为这在网络环境中将不起作用。


0

我在测试ASP.NET Web API时遇到了相同的问题

在Visual Studio 2013 Express中开发的Web.Host在SQL Server 2012 Express中创建的数据库使用内置的IIS Express执行测试(工作)修改为使用IIS Local(从属性页-Web选项)使用Fiddler的Ran测试收到错误-无法打开数据库对于提供商...。引用“ APPPOOL \ DefaultAppPool”

有效的解决方案。

在IIS中

单击应用程序池'DefaultAppPool'设置Identify ='ApplicationPoolIdentity'设置.NET Framework = v4.0(即使我的应用程序是4.5)

在SQL Server Management Studio中

右键单击“安全性”文件夹(在SQL Server引擎下,因此适用于所有表),右键单击“用户”,然后添加“ IIS APPPOOL \ DefaultAppPool”。在“授予”列的安全性中,选中要提供的选项。关于以上内容,如果您是DBA,则可能知道并且想要控制这些选项。如果您像我一样,开发人员只想测试您的WEB API服务,该服务恰好也可以通过MVC风格的EF 6访问SQL Server,则只需检查所有内容即可。:)是的,我知道,但是有效。


0

如果添加新的登录名,请确保在服务器属性(右键单击->属性)/安全性下,将身份验证模式设置为sqlserver和Windows,而不仅是Windows。


0

在安全性下添加“所有人”。如果您添加了服务器,并且用户登录到数据库,则缺少此功能。希望这可以帮助。


我们根据需要设置权限。处理身份验证部分,并通过代码检查授权以允许访问。如果您有任何歧义,请随时纠正我。谢谢。
avinava basu 16/09/24

0

作为记录,如果从切换LocalDB到后遇到此错误SQLEXPRESS,请确保数据库已经存在于中SQLEXPRESS。您可以在Management Studio中进行验证。

Entity Framework切换到时使用时,我遇到了同样的问题SQLEXPRESS from LocalDB。我必须运行Update-Database命令。之后,我能够成功连接。


0

我确实按照@JeffOgata所说的做了,但是出现了错误:

Windows NT user or group 'IIS APPPOOL\ASP.NET v4.0' not found. Check the name again. (Microsoft SQL Server, Error: 15401)

我再次看了我的错误消息,它说 Login failed for user 'IIS APPPOOL\DefaultAppPool'.

添加一个名为的用户后,IIS APPPOOL\DefaultAppPool一切正常。


0

我使用SQL Server Profiler(在SSMS =>工具菜单中可用),然后看到(当IIS尝试连接到数据库时)我的IIS用户出于某种原因NT AUTHORITY \ IUSR,无论此问题答案中建议的所有步骤如何。因此,我将该用户添加到了SQL Server,并且可以正常工作...


0

在Asp.net网络表单中,

从以下位置安装asp.net时已修复此错误:

服务器管理器>管理>添加角色和功能>服务器角色> Web服务器(IIS)> Web服务器>应用程序开发>已安装ASP.NET 3.5 / 4.6。

我的问题解决了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.