ChatGPT解决这个技术问题 Extra ChatGPT

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

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

Related question

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

您是否允许网站文件夹上的应用程序池身份权限?
我不确定,你能告诉我怎么做吗?
实际上,正如 adrift 所说,这可能是一个 sql 安全问题。您最好为 AppPool 设置一个 NT 用户帐户,然后将该权限授予网站文件夹和 SQL 中的相应表
@GibboK:我鼓励您在此处查看已接受的答案并选择更合适的答案。公认的答案是将许多人带入安全黑洞。是的,它有效。不,这确实不是一个好主意。请参阅下面的评论。

J
Jeff Ogata

看起来它试图打开与 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_datareaderdb_datawriter,但如果您通过 EF 执行此操作,我认为您仍然需要授予执行存储过程的权限。您可以查看角色 here 的详细信息。


谢谢,我做了你伤心的事,现在我收到这个错误:无法打开登录请求的数据库“SiteNameExtension”。登录失败。用户 'IIS APPPOOL\DefaultAppPool' 登录失败。
非常重要:不要点击搜索来确认登录!它不会识别它,但它会工作。只需将其键入为 IIS APPPOOL\SimonsAppPoolName。看到这个stackoverflow.com/questions/1933134
相反,最好将 IIS 中的“Identity”更改为“LocalSystem”,如下一个答案中所述。
当您的 SQL Server 实例位于另一台主机上然后是您的 IIS 主机时,这可以工作吗?因为我需要修复同样的问题,但是 SQL 和 IIS 不在同一台机器上。因此,为该新用户使用 Windows 身份验证将不起作用
对我来说,要添加的用户是“IIS APPPOOL\DefaultAppPool”。然后它起作用了。
s
slugster

https://i.stack.imgur.com/PcbL4.png

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

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


@GibboK,如果您担心安全性,请不要这样做。请参阅technet.microsoft.com/en-us/library/dd378907(v=WS.10).aspx
除了以 LocalSystem 身份运行应用程序池之外,我还必须将“NT AUTHORITY\SYSTEM”用户映射到数据库角色
这很臭。将 SYSTEM 权限授予 Web 应用程序是灾难的根源,并且允许不法分子有各种机会不仅对您的 Web 应用程序,而且对整个托管服务器造成不良影响。仅仅因为数据库接受来自 SYSTEM 的登录并不意味着您应该以 SYSTEM 身份运行您的 Web 应用程序。 Windows 桌面甚至不允许您以 SYSTEM 身份运行(无需跳过箍)。以这种权限运行 webapp 是一个非常非常愚蠢的想法。您应该让数据库接受当前的 apppool 身份。如果可以的话,我会-100。 -1。
SYSTEM 比管理员具有更高的特权。您永远不应该使用任何接近该级别的东西来运行您的 Web 服务器。
我只是让来宾帐户成为管理员组的成员。简单,干净,从来没有安全废话的任何问题。
D
DevT

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

右键单击 db->属性->权限->查看服务器权限 ->然后选择 IIS APPPOOL\ASP.NET v4.0 并授予权限。

https://i.stack.imgur.com/uDola.png


您正在描述向该应用程序池标识授予服务器级别权限的上述过程(和图像)吗?听起来不是个好主意。
这个用户应该得到奖牌!除了这个没有任何帮助!
我试过你的方法。它就像一种魅力一样有帮助。谢谢。
经过3天的奋斗终于工作了。多谢
J
JGilmartin

确保你有...

Trusted_Connection=false;

在您的连接字符串中


在连接字符串中设置 Trusted_Connection=true 将使用 IIS 身份用户配置文件覆盖 SQL 身份验证值。
在我的情况下,从连接字符串中删除:Integrated Security=True 已修复它。
为我工作。拯救了这一天@JefftheBear
R
Rolwin Crasta

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

谢谢,最简单的方法;)+1
C
Community

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

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


L
Lijo

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

https://i.stack.imgur.com/Eimtu.png

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

https://i.stack.imgur.com/He8s0.png

https://i.stack.imgur.com/mvs8V.png

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


m
mehranSattary

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


C
Christian

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

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


不好意思,不知道怎么弄,能不能给个教程?感谢您对此的帮助
不要这样做,IIS 更改应用程序池标识是有原因的,learn.iis.net/page.aspx/624/application-pool-identities
@LeSnip3R 链接断开
A
Amar Gadekar

如果您使用的是 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 服务。重新启动应用程序池。

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


完美的! LocalSystem 为我解决了这个问题 :)
z
zar

我必须在 SQL Server 中创建一个用户“IIS APPPOOL\DefaultAppPool”,如下所示。安全 > 登录 > 右键单击并按“新登录”。您只需输入屏幕中红色显示的用户名。

https://i.stack.imgur.com/x3MZV.png

然后进入该新用户属性,检查该用户将访问的数据库(下方标记为蓝色)并选择 db_owner。我必须选择,因为虽然连接正常,但如果未选择此选项,后续的 SELECT 查询将无权访问。

https://i.stack.imgur.com/Fq4Ta.png

这两个应该做。基本上,您正在为数据库创建新用户所有者,因此它具有完全访问权限。

您不需要重新启动 SQL Server 或任何东西,应该可以工作。


b
bonh

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

这解决了问题。


T
The Coder

我遇到了这个问题,它实际上是由不同的东西引起的——我的数据库中有“IIS APPPOOL\ASP.NET v4.0”用户,但它仍然无法正常工作。

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

将登录名 'IIS APPPOOL\ASP.NET v4.0' 添加到 Security -> Logins,SQL Server 自动将其映射到数据库中的用户(这曾经必须手动完成)并修复了问题。


只是添加 ... 在左侧,在 Permissions ... 勾选 db_writer 和 db_reader;并选择将使用这些权限的数据库。
J
Julian

我收到了这条消息,我在 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 用户,那么两者都是正确的。

汤姆


这为我们解决了这个问题,我们不知道为什么。 IIS/AppPool 只是劫持了明确表示“Integrated Security=true”的连接字符串?为什么??
s
subramanya46

我有同样的问题,我通过将 Integrated Security=True 更改为 false 现在解决了它


W
Widor

设置身份只会使这在我的页面中起作用。


s
subsci

当您启动 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 比上面提到的企业网络情况更容易。


D
Daming Fu

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

H
Hammad Khan

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

这应该修复错误。


S
Shanaka Rathnayaka

https://i.stack.imgur.com/Ti9Bs.png

使用默认架构添加用户名和登录名为 IIS APPPOOL\ASP.NET v4.0 的新用户。转到所有者架构和成员资格,检查 db_datareader、db_datawriter


A
Atta Ur Rehman Zai

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


k
komodosp

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

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

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


Z
Zolfaghari

在 Asp.net 网络表单中,

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

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

我的问题解决了。


E
Erik Rodriguez

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


D
Dharman

转到 iis -> 应用程序池 -> 找到您在应用程序中使用的应用程序池 -> 单击它,然后单击“操作”面板中的“高级设置”。找到“身份”属性并将其更改为本地系统。


S
Simon_Weaver

您是否按照 @Teddy 的建议进行操作,但仍然遇到同样的错误?

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


L
Luis

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


B
Brian Quinn

我在测试 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,那么只需检查所有内容。 :) 是的,我知道,但它奏效了。


b
badr slaoui

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


a
avinava basu

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


我们根据需要设置权限。认证部分被处理,我们通过代码检查授权以允许访问。如果您觉得有任何歧义,请随时纠正我。谢谢。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅