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

我有一个Web项目(C#Asp.Net,EF 4,MS SQL 2008和IIS 7),我需要迁移到本地IIS 7(在CASSINI工作正常)。

本地在IIS中我有我的Default Web Site与我的部署。 我的部署和Default Web Site都在池ASP.NET 4.0版(查看图像设置)池目标框架4作为我的Web项目。 池设置 浏览网站时,浏览器不会显示页面,而是允许浏览器下载页面。

我有本地运行在IIS上的其他项目,他们工作没有问题(但他们不使用entity framework)。

使用事件logging器我看到错误如下:

 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,不需要手动设置权限。

看起来它试图打开连接到SQL Server失败。

您需要为IIS APPPOOL\ASP.NET v4.0添加login到SQL Server并授予对数据库的权限。

在SSMS中的服务器下,展开安全性,然后右键单击login并select“新buildlogin…”。

在“新buildlogin”对话框中,input应用程序池作为login名,然后单击“确定”。

在这里输入图像描述

然后,您可以右键单击应用程序池的login名,select“属性”并select“用户映射”。 检查适当的数据库和适当的angular色。 我想你可以selectdb_datareaderdb_datawriter ,但是我认为如果你通过EF来执行,你仍然需要授予执行存储过程的权限。 你可以在这里查看angular色的细节。

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

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

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

确保你有…

 Trusted_Connection=false; 

在你的连接string中

如果在你指定的连接string中:

 User ID=xxx;Password=yyy 

但在连接string中有:

 Trusted_Connection=true; 

SQL Server将使用Windows身份validation,因此您的连接值将被忽略并重写(IIS将使用在Identity用户configuration文件中指定的Windows帐户)。 更多信息在这里

如果在连接string中有相同的情况:

  Integrated Security = true; 

要么

  Integrated Security = SSPI; 

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

我用下面的图像解决了这个问题。

右键单击db-> properties – > permission – > View Server permission – >,然后selectIIS APPPOOL\ASP.NET v4.0并授予权限。

分贝

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

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

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

这解决了这个问题。

首先,你需要清除,如果你使用Windows身份validation,你没有提到你的连接string中的任何用户名密码,然后:

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

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

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

下面是Windows身份validationWCF的步骤:•打开IIS(Windows + R(运行),然后键入inetmgr,然后单击确定)•在连接下双击您的PC名称•单击应用程序池•select您的应用程序池(DefaultAppPool)点击右键进行操作高级设置:•进入过程模型部分,•点击标识。 •现在selectLocalSystem。

现在打开你的SQL Serverpipe理工作室:打开run->然后键入ssms,然后在ssms中按OK,login使用您的Windows身份validation帐户。 打开安全选项卡展开login选项卡,然后您将能够查看您的帐户。

现在打开您帐户的属性到userMapping,然后select您要连接的数据库,然后选中您要用于所选数据库的angular色成员资格服务,单击确定。 (对于networking服务,即内联网用户,您也需要为NT AUTHORITY \ SYSTEM用户configuration以上设置)

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

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

运行这个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 

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

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

添加login“IIS APPPOOL \ ASP.NET v4.0”安全 – >login,SQL Server自动将其映射到数据库中的用户(这以前必须手动完成),并解决问题。

我有这个消息,我在Web服务器上使用Windows身份validation。

我希望当前通过身份validation的Web用户对数据库进行身份validation,而不是使用App Pool中指定的IIS APPPOOL \ ASP.NET v4用户。

我发现通过在web.config中input以下内容为我解决了这个问题:

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

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

我看到其他答案有关在SQL数据库中创buildAppPool用户名或只是使用SQL身份validation。 如果您不想在SQL内部捕获或保护个别Windows用户,则两者都是正确的。

汤姆

设置身份只会使这个工作在我的网页上。

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

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

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

继续在所有连接string中使用Windows集成安全性。 在SQL Server中,将域用户添加为login名,并根据每个网站将权限授予数据库,表,SP等。 例如,Website1使用的DB1具有User1的login名,因为Website1作为User1在App Pool上运行。

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

如果在web.config中添加了连接string,请确保“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> 

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

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

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

应该修复错误。

去iis – >应用程序池 – >在应用程序中find你的应用程序池

在这里输入图像描述

select您的应用程序池用于应用程序右键单击select高级设置

在这里输入图像描述

select应用程序池标识 在这里输入图像描述

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

你有没有做过@Teddy推荐的东西,你仍然得到同样的错误?

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

在DefaultAppPool中在Identity属性和Sql Server中设置NetworkService添加用户networking服务,并赋予它适当的权限到您的数据库,这对我来说很好,我已经在本地进行了testing,但我认为这是从任何连接的最佳configurationnetworking中的其他计算机。 当你在IIS中的身份设置LocalSystem的工作正常,并没有必要在Sql Server中创build任何其他用户,但我认为这不会在networking环境中工作。

我碰到了testingASP.NET Web API的相同问题

在Visual Studio 2013 Express中开发Web.Host在SQL Server 2012 Express中创build的数据库使用内置IIS Express执行testing(工作)修改为使用IIS本地(从属性页 – web选项)使用Fiddler进行testing收到错误 – 无法打开数据库为提供者….援引'APPPOOL \ DefaultAppPool'

解决scheme,工作。

在IIS中

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

在SQL Server Management Studio中

右键单击安全文件夹(SQL Server引擎下适用于所有表)右键单击用户并添加'IIS APPPOOL \ DefaultAppPool'在'授权'列上的安全检查您想要给的选项。 关于上述如果你是DBA,你可能知道并想要控制这些选项。 如果你像我一样,开发人员只是想testing你的WEB API服务,而这恰好也是通过MVC风格的EF 6访问SQL Server的,那么只需要检查一切。 :)是的,我知道,但它的工作。

如果你添加一个新的login,请确保在服务器属性(右键 – >属性)/安全,身份validation模式设置为sqlserver和Windows不仅窗口。

在安全下添加“每个人”。 如果您添加了服务器和login到数据库的用户,那么这是缺less的东西。 希望这可以帮助。

为了logging,如果在从LocalDB切换到SQLEXPRESS后遇到此错误,请确保数据库已存在于SQLEXPRESS 。 您可以在Management Studio中validation这一点。

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

为用户IIS APPPOOL\ASP.NET v4.0授予数据库权限的另一种方法如下。
在这里输入图像描述

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

在IIS中托pipe应用程序时,我遇到了类似的问题

我改变了游泳池的身份和它的工作

 ApplicationPoolIdentity -> NetworkService 

我完全按照@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的用户后,一切正常。