我有一个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上运行其他项目,它们没有问题(但它们不使用实体框架) .
使用事件 Logger 我看到如下错误:
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,不需要手动设置权限 .
30 回答
我讨厌ApplicationPoolIdentity . 我总是将Windows用户帐户设置为AppPools上的帐户 .
正如adrift所说,它听起来像是一个数据库安全问题 . 因此,创建一个NT用户帐户,将其分配给ASP.NET v4.0 AppPool,然后将其授予网站文件夹和SQL中的相关表 .
如果你添加一个新的登录,请确保在服务器属性(右键 - >属性)/安全性下,身份验证模式设置为sqlserver和windows不仅仅是windows .
我使用sql解决了这个问题,如下图所示 .
右键单击db-> properties - > permission - > View Server权限 - >,然后选择
IIS APPPOOL\ASP.NET v4.0
并授予权限 .我使用SQL Server Profiler(在SSMS =>工具菜单中可用)并看到(当IIS尝试连接到数据库时)我的IIS用户出于某种原因NT AUTHORITY \ IUSR,无论此问题的答案中建议的所有步骤 . 所以我将该用户添加到SQL Server,它工作...
我在IIS中主持应用程序时遇到了类似的问题
Solution
我改变了游泳池身份,它的工作就在我身上
如果在 connection string 中你指定了:
但在_512569中有:
SQL Server将使用Windows身份验证,因此将忽略和覆盖您的连接值(IIS将使用Identity用户配置文件中指定的Windows帐户) . more info here
如果在 connection string 中存在以下情况,则同样适用:
要么
因为Windows身份验证将用于连接到数据库服务器 . more info here
在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已安装 .
我的问题已解决 .
以为我会将此作为答案发布,因为它与问题相关,并且在某些情况下可以回答 .
同样的消息也出现 if the database does not exist!
确保您的连接字符串没有拼写错误,指向正确的服务器实例等 .
对于记录,如果在从
LocalDB
切换到SQLEXPRESS
后遇到此错误,请确保数据库已存在于SQLEXPRESS
中 . 您可以在Management Studio中对此进行验证 .切换到
SQLEXPRESS from LocalDB
后使用Entity Framework
时出现同样的问题 . 我不得不运行Update-Database
命令 . 之后我能够成功连接 .确保你有......
在您的连接字符串中
您可以从IIS7 - >应用程序池 - >高级设置更改ApplicationPoolIdentity .
在ApplicationPoolIdentity下,您将找到本地系统 . 这将使您的应用程序在
NT AUTHORITY\SYSTEM
下运行,这是默认情况下数据库的现有登录 .Edit: Before applying this suggestion you should note and understand the security implications.
如果在web.config中添加了连接字符串,请确保“Integrated Security = false;”所以它会使用web.config中指定的id和密码 .
我和@JeffOgata完全一样,但我得到了错误:
我再次查看了我的错误消息,它说
Login failed for user 'IIS APPPOOL\DefaultAppPool'.
添加名为
IIS APPPOOL\DefaultAppPool
的用户后,一切正常 .在安全性下添加“所有人” . 如果您添加了服务器和登录到数据库的用户,那么这是您缺少的 . 希望这可以帮助 .
我有这个问题,它实际上是由不同的东西引起的 - 我的数据库中有'IIS APPPOOL \ ASP.NET v4.0'用户,但它仍然无效 .
我最近升级了我的SQL Server安装,并且在此过程中用户已经与登录断开连接 - 所以在数据库 - >安全 - >用户下有一个'IIS APPPOOL \ ASP.NET v4.0'但是没有用户没有安全 - >登录 .
将Login“IIS APPPOOL \ ASP.NET v4.0”添加到安全性 - >登录,SQL Server自动将其映射到数据库中的用户(以前必须手动完成)并修复问题 .
在DefaultAppPool中,在Identity属性和Sql Server中设置NetworkService添加用户网络服务,并为其提供适当的数据库权限,这对我来说非常好,我已在本地测试,但我认为这是从网络中任何其他计算机连接的最佳配置 . 当你在IIS中的身份中设置LocalSystem时,它运行良好,并且没有必要在Sql Server中创建任何其他用户,但我认为这在网络环境中不起作用 .
不要使用集成安全性 . 使用
User Id=yourUser; pwd=yourPwd;
这解决了这个问题 .
运行这个sql脚本
正如所指出的, Do not use Windows Authentication, Use SQL Server Authentication
此外,如果使用“服务器连接”对话框创建连接,请确保检查web.config中的连接 . 您可能创建/修改了连接,并将其作为可信连接存储在web.config中 . 只需使用此身份验证
哪个应该修复错误 .
我有同样的问题我通过将
Integrated Security=True
更改为 false 来解决它现在正在工作如果您使用的是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服务 . 重启应用程序池 .
您现在可以连接数据库了 .
我有这个消息,我在Web服务器上使用Windows身份验证 .
我希望对当前经过身份验证的Web用户进行数据库身份验证,而不是使用应用程序池中指定的IIS APPPOOL \ ASP.NET v4用户 .
我通过在web.config中输入以下内容找到了我:
https://msdn.microsoft.com/en-us/library/bsz5788z.aspx
我看到有关在SQL DB中创建AppPool用户名的其他答案,或者仅使用SQL Auth . 如果您不想在SQL中捕获或保护单个Windows用户,那么两者都是正确的 .
汤姆
我遇到了测试ASP.NET Web API的同样问题
在SQL Server 2012 Express中创建的Visual Studio 2013 Express数据库中开发Web.Host使用内置的IIS Express执行测试(工作)修改为使用IIS Local(来自属性页面 - web选项)使用Fiddler进行测试收到错误 - 无法打开数据库for provider ....引用'APPPOOL \ DefaultAppPool'
有效的解决方案 .
在IIS中
单击应用程序池'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,然后只需检查所有内容 . :)是的我知道,但它确实有效 .
设置身份只会使我的页面工作 .
您可以在SSMS更新后创建的特定数据库中遇到此错误 . 打开SSMS并选择数据库并打开所需的数据库,然后单击 Security--> Users--> and right click on Users and click again on 'New User' 并添加 'NT AUTHORITY\Authenticated Users' 和保存您的工作,并在Web /桌面上转到您的表格 . 请享用....
看起来它没有尝试打开与SQL Server的连接 .
您需要为SQL Server添加登录
IIS APPPOOL\ASP.NET v4.0
并向数据库授予权限 .在SSMS中,在服务器下,展开“安全性”,然后右键单击“登录”并选择“新建登录...” .
在“新建登录”对话框中,输入应用程序池作为登录名,然后单击“确定” .
然后,您可以右键单击应用程序池的登录名,选择“属性”,然后选择“"User Mapping"” . 检查相应的数据库和相应的角色 . 我想您可以选择
db_datareader
和db_datawriter
,但我认为如果您通过EF执行此操作,您仍需要授予执行存储过程的权限 . 您可以查看角色here的详细信息 .为用户
IIS APPPOOL\ASP.NET v4.0
授予数据库权限的另一种方法如下 .使用您的默认架构将具有用户名和登录名的新用户添加为
IIS APPPOOL\ASP.NET v4.0
.转到所有者架构和成员身份,检查db_datareader,db_datawriter
你做了什么
@Teddy
推荐你 STILL 得到同样的错误?确保您正在更改与虚拟目录对应的应用程序池的设置,而不是父服务器 . 每个虚拟目录都有自己的AppPool,不会继承 .
启动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比上面提到的企业网络情况更容易 .
go to iis -> application pools -> find your application pool used in application
select your application pool used for the application right click select advanced settings
选择应用程序池标识
select built in as Local System and click ok