提问



我有一个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)


相关问题


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

最佳参考


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


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


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


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





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

其它参考1


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



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


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

其它参考2


确保你有......


Trusted_Connection=false;


在您的连接字符串中

其它参考3


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


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




其它参考4


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


User ID=xxx;Password=yyy


但在连接字符串中有:


Trusted_Connection=true;


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


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


 Integrated Security = true;


要么


 Integrated Security = SSPI;


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

其它参考5


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


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

其它参考6


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

其它参考7


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


这解决了这个问题。

其它参考8


如果您使用的是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,然后选择要连接的数据库
然后检查要用于所选数据库的角色成员资格服务
点击确定。
(对于网络服务,即内部网用户,您还需要为NT AUTHORITY \\ SYSTEM用户配置上述设置)


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


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

其它参考9


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


[36]


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


[37]


选择应用程序池标识
[38]


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


其它参考10


我有这个问题,它实际上是由不同的东西引起的 - 我的数据库中有IIS APPPOOL \\ ASP.NET v4.0用户,但它仍然没有工作。


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


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

其它参考11


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


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


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


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


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


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


汤姆

其它参考12


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

其它参考13


启动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不能在安全的生产环境中使用这一事实微软提供了部署工具。但是可怜的开发人员习惯于使用localDB和localWebServer在新的简易VS IDE中开箱即用,因为这些工具很难用于开发人员,特别是对于这样的开发人员缺乏SysAdmin和DBAdmin支持或他们的专业知识。尽管如此,部署到Azure比上面提到的企业网络情况更容易。

其它参考14


如果在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>

其它参考15


正如所指出的,不要使用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"/>


哪个应该修复错误。

其它参考16


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

[40]







  1. 使用您的默认架构添加用户名和登录名为IIS APPPOOL\ASP.NET v4.0的新用户。

  2. 转到所有者架构和成员身份,检查db_datareader,db_datawriter


其它参考17


你做过什么@Teddy推荐而你仍然得到同样的错误?


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

其它参考18


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

其它参考19


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


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


有效的解决方案。


在IIS中


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


在SQL Server Management Studio中


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

其它参考20


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

其它参考21


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

其它参考22


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


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

其它参考23


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


解决方案


我改变了游泳池身份,它的工作就在我身上


ApplicationPoolIdentity -> NetworkService

其它参考24


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

其它参考25


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


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


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

其它参考26


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

其它参考27


在Asp.net webform中,


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


Server Manager> Manage> Add Role and Feature> Server Roles> Web Server(IIS)> Web Server> Application Development> ASP.NET 3.5/4.6已安装。


我的问题已解决。