我有一个 Web 项目(C# Asp.Net、EF 4、MS SQL 2008 和 IIS 7),我需要在本地将它迁移到 IIS 7(目前与 CASSINI 配合得很好)。
https://i.stack.imgur.com/nNY78.png
我有其他项目在本地运行在 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 中,在服务器下,展开 Security,然后右键单击 Logins 并选择“New Login...”。
在 New Login 对话框中,输入应用程序池作为登录名,然后单击“OK”。
https://i.stack.imgur.com/6sfIM.png
然后,您可以右键单击应用程序池的登录名,选择属性并选择“用户映射”。检查适当的数据库和适当的角色。我认为您可以只选择 db_datareader
和 db_datawriter
,但如果您通过 EF 执行此操作,我认为您仍然需要授予执行存储过程的权限。您可以查看角色 here 的详细信息。
https://i.stack.imgur.com/PcbL4.png
在 ApplicationPoolIdentity 下,您将找到本地系统。这将使您的应用程序在 NT AUTHORITY\SYSTEM
下运行,这是默认情况下数据库的现有登录名。
编辑:在应用此建议之前,您应该注意并了解安全隐患。
我使用 sql 解决了这个问题,如下图所示。
右键单击 db->属性->权限->查看服务器权限 ->然后选择 IIS APPPOOL\ASP.NET v4.0
并授予权限。
https://i.stack.imgur.com/uDola.png
确保你有...
Trusted_Connection=false;
在您的连接字符串中
运行这个 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
如果在您指定的连接字符串中:
User ID=xxx;Password=yyy
但在连接字符串中有:
Trusted_Connection=true;
SQL Server 将使用 Windows 身份验证,因此您的连接值将被忽略和覆盖(IIS 将使用身份用户配置文件中指定的 Windows 帐户)。 more info here
如果在连接字符串中有以下内容,则同样适用:
Integrated Security = true;
或者
Integrated Security = SSPI;
因为 Windows 身份验证将用于连接到数据库服务器。 more info here
转到 iis -> 应用程序池 -> 找到您在应用程序中使用的应用程序池
https://i.stack.imgur.com/Eimtu.png
选择用于应用程序的应用程序池右键单击选择高级设置
https://i.stack.imgur.com/He8s0.png
https://i.stack.imgur.com/mvs8V.png
选择内置为本地系统,然后单击确定
1_in SqlServer Security=>Login=>NT AUTHORITY\SYSTEM=>RightClick=>Property=>UserMaping=>Select YourDatabse=>Public&&Owner Select=>OK 2_In IIs Application Pools DefaultAppPool=>Advance Setting=>Identity=>LocalSystem=>Ok
我讨厌 ApplicationPoolIdentity。我总是将 Windows 用户帐户设置为 AppPools 上的帐户。
正如 adrift 所说,这听起来确实像是一个数据库安全问题。因此,创建一个 NT 用户帐户,将其分配给 ASP.NET v4.0 AppPool,然后授予它访问网站文件夹和 SQL 中相关表的权限。
如果您使用的是 Windows 身份验证,并且您没有在连接字符串中提及任何用户名密码,那么您需要清除的第一件事是:
当您通过 localhost 运行代码时会发生什么:当您从 localhost 运行 wcf 测试客户端时,它将能够与数据库通信,因为本地调试模式应用程序正在通过您的帐户服务调用数据库。因此它可以访问数据库,因为 devenv.exe 在您的用户帐户下运行。
但是当您在 IIS 中部署 Web 服务时。现在了解此服务在 IIS 下而不是在您的帐户下运行。所以需要给IIS服务分配访问权限,才能访问sql server进行windows认证。由于访问权限问题和用户_______登录失败,您的 Web 服务将无法与 SQL 服务器通信(您的用户会来)
因此,如果您使用 Windows 身份验证来连接数据库,则只需更改 IIS 应用程序池设置。您需要将 IIS 应用程序池的标识更改为本地系统。
以下是 Windows 身份验证 WCF 的步骤:
1)打开IIS(windows+R(运行)然后输入inetmgr,然后点击ok)
2) 在连接下双击您的 PC 名称
3) 单击应用程序池
4)选择您的应用程序池(DefaultAppPool)
5)然后在右键单击高级设置的操作下:
6)转到过程模型部分,然后
7) 点击身份。
8) 现在选择本地系统。
现在打开你的 sql server management studio:打开 run-> 然后输入 ssms -> 然后按 ok 在 ssms 中,使用你的 windows 身份验证帐户登录。打开安全选项卡展开登录选项卡,然后您将能够查看您的帐户。
现在打开您帐户的属性,转到 userMapping,然后选择您要连接的数据库,然后检查您要用于所选数据库的角色成员服务。点击确定。
(对于网络服务,即内网用户,您也需要为 NT AUTHORITY\SYSTEM 用户配置上述设置)
添加 Trusted_Connection=True;连接字符串中的属性。保存并部署 Web 服务。重新启动应用程序池。
您现在就可以连接数据库了。
我必须在 SQL Server 中创建一个用户“IIS APPPOOL\DefaultAppPool”,如下所示。安全 > 登录 > 右键单击并按“新登录”。您只需输入屏幕中红色显示的用户名。
https://i.stack.imgur.com/x3MZV.png
然后进入该新用户属性,检查该用户将访问的数据库(下方标记为蓝色)并选择 db_owner
。我必须选择,因为虽然连接正常,但如果未选择此选项,后续的 SELECT 查询将无权访问。
https://i.stack.imgur.com/Fq4Ta.png
这两个应该做。基本上,您正在为数据库创建新用户所有者,因此它具有完全访问权限。
您不需要重新启动 SQL Server 或任何东西,应该可以工作。
不要使用集成安全性。使用User Id=yourUser; pwd=yourPwd;
这解决了问题。
我遇到了这个问题,它实际上是由不同的东西引起的——我的数据库中有“IIS APPPOOL\ASP.NET v4.0”用户,但它仍然无法正常工作。
我最近升级了我的 SQL Server 安装,并且在此过程中用户已与登录断开连接 - 因此在数据库 -> 安全 -> 用户下有一个“IIS APPPOOL\ASP.NET v4.0”,但没有用户不在安全下- >登录。
将登录名 'IIS APPPOOL\ASP.NET v4.0' 添加到 Security -> Logins,SQL Server 自动将其映射到数据库中的用户(这曾经必须手动完成)并修复了问题。
我收到了这条消息,我在 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
我看到有关在 SQL DB 中创建 AppPool 用户名或仅使用 SQL Auth 的其他答案。如果您不想在 SQL 中捕获或保护单个 Windows 用户,那么两者都是正确的。
汤姆
我有同样的问题,我通过将 Integrated Security=True
更改为 false 现在解决了它
设置身份只会使这在我的页面中起作用。
当您启动 Visual Studio 应用程序时,Cassini 将您的网站作为您自己的用户身份运行。 IIS 将您的网站作为 App Pool Identity 运行。除非授予 App Pool Identity 访问数据库的权限,否则您会收到错误消息。
IIS 引入了 App Pool Identity 以提高安全性。您可以在默认的 App Pool Identity 下运行网站,或者使用自己的名称创建一个新的应用程序池,或者使用自己的名称创建一个在用户帐户(通常是域帐户)下运行的新应用程序池。
在联网情况下(不在 Azure 中),您可以在 Active Directory 域用户帐户下运行新的应用程序池;我更喜欢这个而不是机器帐户。这样做可以提供细粒度的安全性和对包括数据库在内的网络资源的细粒度访问。每个网站都在不同的应用程序池上运行(并且每个网站都在自己的域用户帐户下运行)。
继续在所有连接字符串中使用 Windows 集成安全性。在 SQL Server 中,将域用户添加为登录名,并在每个网站的基础上授予对数据库、表、SP 等的权限。例如,Website1 使用的 DB1 具有 User1 的登录名,因为 Website1 作为 User1 在应用程序池上运行。
从 Visual Studio 内置 DB(例如 LocalDB)和内置 Web 服务器部署到生产环境的一个挑战来自开发人员的用户 SID 及其 ACL 不能在安全的生产环境中使用这一事实。 Microsoft 提供了用于部署的工具。但遗憾的是那些习惯于在带有 localDB 和 localWebServer 的新的简单 VS IDE 中开箱即用的一切的可怜的开发人员,因为这些工具对于该开发人员来说很难使用,特别是对于这样一个缺乏 SysAdmin 和 DBAdmin 支持的开发人员或他们的专业知识。尽管如此,部署到 Azure 比上面提到的企业网络情况更容易。
如果您在 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>
正如所指出的,不要使用 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"/>
这应该修复错误。
https://i.stack.imgur.com/Ti9Bs.png
使用默认架构添加用户名和登录名为 IIS APPPOOL\ASP.NET v4.0 的新用户。转到所有者架构和成员资格,检查 db_datareader、db_datawriter
您可能会在 SSMS 更新后创建的特定数据库中遇到此错误。打开 SSMS 并选择您的数据库并打开所需的数据库,然后单击安全性-> 用户-> 并右键单击用户并再次单击“新用户”并添加“NT AUTHORITY\Authenticated Users”并保存您的工作并转到无论您做什么,您都可以在 Web/桌面上使用您的表单。享受....
以为我会将其发布为答案,因为它与问题相关并且在某些情况下可以回答。
如果数据库不存在,也会出现同样的消息!
确保您的连接字符串没有拼写错误,指向正确的服务器实例等。
在 Asp.net 网络表单中,
从以下位置安装 asp.net 时修复了此错误:
服务器管理器 > 管理 > 添加角色和功能 > 服务器角色 > Web 服务器 (IIS) > Web 服务器 > 应用程序开发 > ASP.NET 3.5/4.6 已安装。
我的问题解决了。
类似的事情发生在我身上对我有用的是在网站的 web.config 中将属性 Integrated Security = True 更改为 Integrated Security = false
转到 iis -> 应用程序池 -> 找到您在应用程序中使用的应用程序池 -> 单击它,然后单击“操作”面板中的“高级设置”。找到“身份”属性并将其更改为本地系统。
您是否按照 @Teddy
的建议进行操作,但仍然遇到同样的错误?
确保您正在更改与您的虚拟目录而不是父服务器相对应的应用程序池的设置。每个虚拟目录都有自己的 AppPool 并且不继承。
在 Identity 属性中的 DefaultAppPool 设置 NetworkService 和 Sql Server 中添加用户网络服务并为其提供对您的数据库的适当权限,这对我来说效果很好,我已经在本地进行了测试,但我认为这是从任何连接的最佳配置网络中的其他计算机。当您在 IIS 中的 Identity 中设置 LocalSystem 时效果很好,并且没有必要在 Sql Server 中创建任何其他用户,但我认为这在网络环境中不起作用。
我在测试 ASP.NET Web API 时遇到了同样的问题
在 Visual Studio 2013 Express 中开发 Web.Host 在 SQL Server 2012 Express 中创建的数据库 使用内置 IIS Express 执行测试(工作) 修改为使用 IIS Local(从属性页面 - Web 选项) 使用 Fiddler 进行运行测试 收到错误 - 无法打开数据库对于提供者.... 引用 'APPPOOL\DefaultAppPool'
有效的解决方案。
在 IIS 中
单击应用程序池 'DefaultAppPool' 设置识别 = 'ApplicationPoolIdentity' 设置 .NET 框架 = v4.0(即使我的应用程序是 4.5)
在 SQL Server 管理工作室中
右键单击安全文件夹(在 SQL Server 引擎下,因此适用于所有表)右键单击用户并添加“IIS APPPOOL\DefaultAppPool” 在“授予”列的安全对象中,检查您要提供的选项。关于上述内容,如果您是 DBA,您可能知道并想要控制这些选项是什么。如果您像我一样,开发人员只是想测试您的 WEB API 服务,该服务恰好也通过 EF 6 以 MVC 样式访问 SQL Server,那么只需检查所有内容。 :) 是的,我知道,但它奏效了。
如果您添加新登录名,请确保在服务器属性(右键单击 -> 属性)/安全性下,身份验证模式设置为 sqlserver 和 windows,而不仅仅是 windows。
在安全下添加“所有人”。如果您添加了服务器和登录到数据库的用户,那么这就是您所缺少的。希望这可以帮助。