无法使用SQL身份验证从IIS托管应用程序连接到SQL Server数据库

本文关键字:SQL 连接 应用程序 数据库 Server IIS 身份验证 | 更新日期: 2023-09-27 18:16:56

我一直在VS 2012中开发一个应用程序,使用实体框架6.0作为我的后端连接。我建立了一个连接到我的SQL Server 2008数据库,并成功地配置了实体框架模型(数据库第一)没有问题。但是,当应用程序在IIS中运行时,当我试图连接到数据库时,我一直得到一个异常。

异常有好几层,但最里面的异常如下:

连接尝试失败,因为被连接方在一段时间后没有正确响应,或者由于连接的主机未能响应,已建立的连接失败

我尝试将连接超时延长到60,但这没有影响,通过其他方式连接时也不需要那么长时间,所以我不认为这与超时有关。调用应用程序是一个Web API项目,托管在本地IIS中,我已经将我的EF模型项目的确切连接字符串复制到Web上。配置文件,如下所示:

<add name="ConnectionName" 
     connectionString="metadata=res://*/ModelName.csdl|res://*/ModelName.ssdl|res://*/ModelName.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=server,portnumber;initial catalog=dbname;persist security info=True;user id=user;password=password;MultipleActiveResultSets=True;&quot;" 
     providerName="System.Data.EntityClient" />

我已经成功地连接到这个连接使用标准的SQL客户端连接(不是从IIS应用程序),通过SQL Server管理工作室,甚至在本地测试时使用相同的EF连接字符串,但由于某种原因,我不能这样做,而通过代码连接时,应用程序托管在IIS。我可以确认DbContext类在调试时使用了适当的连接信息。

更新:我发现这个问题不是特定于实体框架。当我用SQL客户端进行测试时,也会出现这个问题。但是,它确实发生在IIS中托管的每个应用程序中,而不仅仅是我的Web API应用程序。但是,还是不能确定到底是什么问题

无法使用SQL身份验证从IIS托管应用程序连接到SQL Server数据库

在此连接字符串中,SQL Server名为server,端口号为portnumber。显然,您在通过SSMS连接时没有使用此功能。为什么不修改这个连接字符串,使其与SSMS中的连接字符串匹配呢?

至少应该是localhost而不是server:

connectionString="
metadata=res://*/ModelName.csdl|
res://*/ModelName.ssdl|
res://*/ModelName.msl;
provider=System.Data.SqlClient;
provider connection string=&quot;
    data source=localhost;initial catalog=dbname;
persist security info=True;
user id=user;
password=password;
MultipleActiveResultSets=True;&quot;"

(回车只是为了清晰)

我发现了发生这种情况的原因。在IIS中,我必须启用Windows身份验证并禁用应用程序的匿名身份验证。我不知道为什么我无法连接到SQL服务器使用SQL身份验证没有我的Windows身份被验证,但这是解决方案,允许我通过IIS连接。