用户'IIS APPPOOL \ ASP.NET v4.0'登录失败

问题描述 投票:397回答:32

我有一个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(查看设置图像)池目标框架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)

Related question

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

c# asp.net iis-7 web-config
32个回答
552
投票

看起来它没有尝试打开与SQL Server的连接。

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

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

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

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


5
投票

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

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

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

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

以下是Windows身份验证WCF的步骤:•打开IIS(Windows + R(运行),然后键入inetmgr,然后单击“确定”)•在“连接”下双击您的PC名称•单击“应用程序池”•选择您的应用程序池(DefaultAppPool)•然后在右键单击“高级设置”上的操作:•转到“流程模型”部分,然后单击“身份”。 •现在选择LocalSystem。

现在打开你的sql server管理工作室:打开run->然后键入ssms然后在ssms中按ok,使用你的windows身份验证帐户登录。打开安全选项卡展开登录选项卡,然后您就可以查看您的帐户。

现在打开您帐户的属性转到userMapping,然后选择要连接的数据库,然后检查要用于所选数据库的角色成员资格服务,单击确定。 (对于网络服务,即Intranet用户,您还需要为NT AUTHORITY \ SYSTEM用户配置上述设置)

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

您现在可以连接数据库了。


4
投票

我有这个问题,它实际上是由不同的东西造成的 - 我的数据库中有'IIS APPPOOL \ ASP.NET v4.0'用户,但它仍然无法正常工作。

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

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


4
投票

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

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

我通过在web.config中输入以下内容找到了我:

https://msdn.microsoft.com/en-us/library/bsz5788z.aspx

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

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

汤姆


3
投票

正如所指出的,不要使用Windows身份验证,使用SQL Server身份验证

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

<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
投票

设置身份只会使我的页面工作。


2
投票

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

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

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

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

从Visual Studio内置数据库(例如LocalDB)和内置Web服务器部署到生产环境的一个挑战来自于开发人员的用户SID及其ACL不能在安全的生产环境中使用。 Microsoft提供了部署工具。但是可怜的开发人员习惯于使用localDB和localWebServer在新的简易VS IDE中开箱即用,因为这些工具很难用于开发人员,特别是对于缺乏SysAdmin和DBAdmin支持的开发人员而言他们的专业知识。尽管如此,部署到Azure比上面提到的企业网络情况更容易。


2
投票

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

IIS APPPOOL\ASP.NET v4.0

1
投票

为用户enter image description here授予数据库权限的另一种方法如下。 IIS APPPOOL\ASP.NET v4.0

  1. 使用您的默认架构将具有用户名和登录名的新用户添加为Integrated Security=True
  2. 转到所有者架构和成员身份,检查db_datareader,db_datawriter

1
投票

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

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

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


1
投票

我有同样的问题我通过将@Teddy改为false来解决它现在它的工作


330
投票

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

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

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


1
投票

类似的事情发生在我身上对我有用的是在网站的web.config中更改属性Integrated Security = True to Integrated Security = false


0
投票

你做过什么LocalDB推荐,你仍然得到相同的错误?

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


0
投票

在DefaultAppPool中,在Identity属性和Sql Server中设置NetworkService,添加用户网络服务,并为其提供适当的权限,这对我来说非常好,我已在本地测试,但我认为这是从任何连接的最佳配置网络中的其他计算机。当你在IIS中的身份中设置LocalSystem时,它运行良好,并且没有必要在Sql Server中创建任何其他用户,但我认为这在网络环境中不起作用。


0
投票

我遇到了测试ASP.NET Web API的同样问题

在SQL Server 2012 Express中创建的Visual Studio 2013 Express数据库中开发Web.Host使用内置IIS Express执行测试(工作)修改为使用IIS Local(来自属性页面 - web选项)使用Fiddler进行测试收到错误 - 无法打开数据库for provider ....引用'APPPOOL \ DefaultAppPool'

解决方案有效。

在这些

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

在SQL Server Management Studio中

右键单击Security文件夹(在SQL Server引擎下,因此适用于所有表)右键单击User并添加'IIS APPPOOL \ DefaultAppPool'在'Grant'列的securables中检查您要提供的选项。关于上述情况,如果您是DBA,您可能知道并希望控制这些选项。如果你像我一样,开发人员只是想测试你的WEB API服务,它恰好也可以通过MVC风格的EF 6访问SQL Server,然后检查一切。 :)是的我知道,但它确实有效。


0
投票

如果你添加一个新的登录,请确保在服务器属性(rightclick - > properties)/ security下,身份验证模式设置为sqlserver和windows不仅仅是windows。


0
投票

在安全性下添加“所有人”。如果您添加了服务器和登录数据库的用户,那么这是您缺少的。希望这可以帮助。


0
投票

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

切换到SQLEXPRESS from LocalDB后使用Update-Database时遇到了同样的问题。我不得不运行Windows NT user or group 'IIS APPPOOL\ASP.NET v4.0' not found. Check the name again. (Microsoft SQL Server, Error: 15401) 命令。之后我能够成功连接。


0
投票

我和@JeffOgata完全一样,但我得到了错误:

Login failed for user 'IIS APPPOOL\DefaultAppPool'.

我再次看了我的错误信息,它说IIS APPPOOL\DefaultAppPool

添加名为qazxswpoi的用户后,一切正常。


0
投票

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


0
投票

在Asp.net webform中,

安装asp.net时修复此错误:

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

我的问题已解决。


28
投票

确保你有......

IIS APPPOOL\ASP.NET v4.0

在您的连接字符串中


0
投票

您可以在SSMS更新后创建的特定数据库中遇到此错误。打开SSMS并选择您的数据库并打开您需要的数据库,然后单击安全性 - >用户 - >并右键单击用户并再次单击“新用户”并添加“NT AUTHORITY \ Authenticated Users”并保存您的工作并转到您在Web /桌面上的表格无论如何。请享用....


21
投票

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

右键单击db-> properties - > permission - > View Server权限 - >,然后选择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 并授予权限。


17
投票

运行这个sql脚本

User ID=xxx;Password=yyy

9
投票

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

Trusted_Connection=true;

但在连接字符串中有:

more info here

SQL Server将使用Windows身份验证,因此将忽略和覆盖您的连接值(IIS将使用Identity用户配置文件中指定的Windows帐户)。 Integrated Security = true;

如果在连接字符串中存在以下情况,则同样适用:

 Integrated Security = SSPI;

要么

more info here

因为Windows身份验证将用于连接到数据库服务器。 enter image description here


8
投票

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

enter image description here

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

enter image description here

选择应用程序池标识User Id=yourUser; pwd=yourPwd;

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


7
投票

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

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


6
投票

不要使用集成安全性。使用<system.web> <identity impersonate="true" /> </system.web>

这解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.