关于C #用户登录失败:1 apppoolasp.net V4.0是for

Login failed for user 'IIS APPPOOLASP.NET v4.0'

我有一个Web项目(C ASP.NET、EF4、MS SQL 2008和IIS 7),我需要在本地将其迁移到IIS 7(目前与Cassini一起工作正常)。

在本地,我部署了我的Default Web Site。我的deploy和Default Web Site都在pool asp.net v4.0(查看设置图像)pool target framework 4上,作为我的Web项目。Pool Settings当访问该站点时,浏览器不显示该页面,而是允许浏览器下载该页面。

我在本地的IIS上运行了其他项目,它们没有问题(但它们不使用实体框架)。

使用事件记录器,我可以看到以下错误:

1
2
3
4
5
6
7
8
9
10
11
12
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中,在服务器下展开安全性,然后右键单击登录并选择"新建登录…"。

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

enter image description here

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


您可以从iis7->application poolidity->advanced settings更改applicationpoolidity。AdvancedSettings

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

编辑:在应用此建议之前,您应该注意并理解安全含义。


确保……

1
Trusted_Connection=false;

在连接字符串中


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

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

db


运行此SQL脚本

1
2
3
4
5
6
7
8
9
10
11
12
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
User ID=xxx;Password=yyy

但是在连接字符串中有:

1
Trusted_Connection=true;

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

如果连接字符串中有:

1
 Integrated Security = true;

1
 Integrated Security = SSPI;

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


我讨厌这个应用程序。我总是将Windows用户帐户设置为AppPools上的帐户。

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


转到IIS->Application Pools->Find your application pool used in application

enter image description here

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

enter image description here

选择应用程序池标识enter image description here

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


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

这就解决了问题。


首先,如果您使用的是Windows身份验证,并且连接字符串中没有提到任何用户名密码,则需要清除:

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

但当您在IIS中部署Web服务时。现在请理解,此服务在IIS下运行,而不是在您的帐户下运行。因此,您需要为IIS服务分配访问权限,以便访问SQL Server进行Windows身份验证。这里,您的Web服务将无法与SQL Server通信,因为用户的访问权限问题和登录失败(这里是您的用户)

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

以下是Windows身份验证wcf的步骤:?打开IIS(Windows+R(运行),然后键入inetmgr,然后单击"确定"?双击Connections下的PC名称?单击应用程序池?选择应用程序池(默认应用程序池)?然后在"操作"下的右键单击"高级设置:"?转到流程模型部分,然后?点击Identity。?现在选择本地系统。

现在打开您的SQL Server Management Studio:open run->then type ssms then press OK in ssms,login using your windows authentication account。打开"安全"选项卡展开"登录"选项卡,您将能够查看您的帐户。

现在打开您帐户的属性转到用户映射,然后选择要连接的数据库然后检查要用于所选数据库的角色成员身份服务单击确定。(对于网络服务,即Intranet用户,您也需要为NT AUTHORITYSYSTEM USER配置上述设置)

在连接字符串中添加trusted_connection=true;属性。保存并部署Web服务。重新启动应用程序池。

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


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

我希望当前通过身份验证的Web用户通过数据库进行身份验证,而不是使用在应用程序池中指定的IIS AppPoolasp.net v4用户。

我通过在web.config中输入以下内容为我修复了此问题:

1
2
3
<system.web>
  <identity impersonate="true" />
</system.web>

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

我看到了有关在SQL数据库中创建AppPool用户名或仅使用SQL认证的其他答案。如果您不想捕获或保护SQL中的单个Windows用户,这两者都是正确的。

汤姆


我有这个问题,实际上是由一些不同的原因引起的-我的数据库中有"IIS AppPoolASP.NET v4.0"用户,但它仍然不起作用。

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

已将登录名"IIS AppPoolASP.NET v4.0"添加到"安全性"->"登录",SQL Server自动将其映射到数据库中的用户(以前必须手动完成此操作),并解决了问题。


如前所述,不要使用Windows身份验证,使用SQL Server身份验证

另外,如果您使用"服务器连接"对话框创建了连接,请确保检查web.config中的连接。很可能是您创建/修改了连接,并将其存储为web.config中的可信连接。只需使用此身份验证

1
 

应该可以修正错误。


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

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

在网络化的情况下(不在Azure中),您可以在Active Directory域用户帐户下运行新的应用程序池;我更喜欢此帐户而不是计算机帐户。这样做可以提供对网络资源(包括数据库)的粒度安全和粒度访问。每个网站在不同的应用程序池上运行(每个应用程序池都在自己的域用户帐户下运行)。

继续在所有连接字符串中使用Windows集成安全性。在SQL Server中,将域用户添加为登录名,并根据每个网站授予对数据库、表、SP等的权限。例如,website1使用的db1具有用户1的登录名,因为website1作为用户1运行在应用程序池中。

从Visual Studio内置数据库(例如LocalDB)和内置Web服务器部署到生产环境的一个挑战来自这样一个事实:开发人员的用户SID及其ACL不会在安全的生产环境中使用。Microsoft提供了部署工具。但是遗憾的是,这个可怜的开发人员已经习惯了使用localdb和localwebserver在新的easy vs ide中开箱即用的所有东西,因为这些工具对于开发人员来说很难使用,特别是对于缺乏sysadmin和dbadmin支持或专业知识的开发人员。尽管如此,部署到Azure比上述企业网络情况更容易。


如果在web.config中添加了连接字符串,请确保"integrated security=false";这样它将使用web.config中指定的ID和密码。

1
2
3
<connectionStrings>
   
</connectionStrings>

设置标识只能在我的页面中起作用。


为用户IIS APPPOOL\ASP.NET v4.0授予数据库权限的另一种方法如下。< BR>enter image description here

< BR>

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

  • 在DefaultAppPool中,在Identity属性中设置NetworkService,在SQL Server中添加用户网络服务,并授予它对数据库的适当权限,这对我来说非常有效,我在本地测试过,但我认为这是从网络中任何其他计算机连接的最佳配置。当您在IIS中的标识中设置localsystem时,它工作得很好,不需要在SQL Server中创建任何其他用户,但我认为这在网络环境中不起作用。


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

    在Visual Studio 2013学习版中开发了web.host在SQL Server 2012 Express中创建的数据库使用内置的IIS Express执行测试(工作)修改为使用本地IIS(从属性页-Web选项)用小提琴进行测试收到错误-无法打开提供程序的数据库….引用"apppooldefaultapppool"

    有效的解决方案。

    在IIS中

    单击应用程序池"DefaultAppPool"设置identify='applicationPoolIdentity'设置.NET框架=v4.0(即使我的应用程序是4.5)

    在SQL Server Management Studio中

    右键单击安全文件夹(在SQL Server引擎下,因此适用于所有表)右键单击用户并添加"IIS AppPoolDefaultAppPool"在"授予"列的Securables中,检查要提供的选项。关于上述问题,如果您是DBA,您可能知道并希望控制这些选项是什么?如果你像我一样,开发人员只是想测试您的Web API服务也可以通过EF6访问SQL Server在MVC样式中,然后检查所有内容。:)是的,我知道,但它起作用了。


    你做了@Teddy推荐的工作,但仍然得到相同的错误吗?

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


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


    重要信息:在服务器角色中启用"sysadmin"


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

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


    我完全按照@jeffogata所说的做了,但我得到了错误:

    1
    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的用户之后,一切都正常了。


    我想我会把它作为答案贴出来,因为它与问题有关,并且在某些情况下可以回答它。

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

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


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


    在ASP.NET Web窗体中,

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

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

    我的问题解决了。


    在SSMS更新后创建的特定数据库中,您可能会遇到这种错误。打开SSMS并选择数据库并打开所需数据库,然后单击"安全"-->"用户"-->并右键单击"用户",再次单击"新用户",然后添加"NT授权已验证用户",保存您的工作并转到Web/桌面上的表单,无论您做什么。享受…


    我也有同样的问题,我通过把Integrated Security=True改为false解决了这个问题。现在它的工作


    如果添加了新的登录名,请确保在"服务器属性"(rightclick->properties)/security)下,将身份验证模式设置为sqlserver和windows,而不仅仅是Windows。


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

    解决方案

    我改变了游泳池的身份

    1
    ApplicationPoolIdentity -> NetworkService