【问题标题】:Asp.net core 3.1 webapi iis 8 not able to connect to sql serverAsp.net core 3.1 webapi iis 8无法连接到sql server
【发布时间】:2020-12-12 22:52:06
【问题描述】:

我有 asp.net core 3.1 web api。当我在 Visual Studio 本地运行项目时,它工作正常。但是当我将它发布到 IIS 并运行它时,我得到了错误。

500 Internal Server Error","error": "已成功与服务器建立连接,但在登录前握手期间发生错误。 (提供者:TCP Provider,错误:0 - 现有连接被远程主机强行关闭。)“} 或者用户 domain_name\machine_name 登录失败。

连接字符串如下所示

"ConnectionStrings": {
"ABCDB": "Server=xxx-test,80;Database=abc;Integrated Security=true;MultipleActiveResultSets=true;"    

},

我为 .net core 3 安装了托管包。 我的应用程序在添加到数据库并具有权限的 ApplicationPoolIdentity 下运行。我的应用程序池使用 ApplicationPoolIdentity 设置为无托管代码。 未连接到数据库的 api 端点在已发布版本上工作得很好,但任何连接到数据库的东西都会出错。

我提到了几个链接,但运气不好。 https://www.loganfranken.com/blog/1345/why-your-web-application-cant-connect-to-sql-server/

IIS fails to pass windows credentials through to SQL Server for ASP.NET Core app

Why asp.net core app uses different user than AppPool identity for Windows Authentication when connecting to SQL Server?

感谢任何帮助。

编辑:唯一适合我在自定义帐户(我的凭据)下运行 appPool 但在 IIS 上的 appPoolIdentity 下不起作用的东西

【问题讨论】:

  • 为了提高安全性,返回给客户端的错误消息故意隐藏了身份验证错误的性质。但是,在SQL Server错误日志中,对应的错误中包含一个错误状态映射到一个认证失败条件,你可以根据日志中得到的错误状态来判断登录失败的原因。相关信息可以参考这个链接:docs.microsoft.com/en-us/previous-versions/sql/…
  • 我检查了日志,它向我显示了相同的消息 Login failed for user domain name\machine name。找不到与提供的名称匹配的登录名。
  • 您可以尝试在 IIS 中更改站点以使用应用程序池标识,然后将应用程序池标识更改为网络服务。
  • 我试过了,但还是一样。
  • 尝试将“TRUSTED_CONNECTION = TRUE”添加到连接字符串中。

标签: asp.net-core-webapi iis-8


【解决方案1】:

您的环境似乎需要重置。

1- 手动检查 IIS 下的应用文件夹,看看是否可以删除任何缓存文件或类似文件。

2- 理想情况下,将其安装在 IIS 下的新文件夹中

3- 重置 IIS

4- 硬刷新网络浏览器

【讨论】:

  • 这些都试过了。
【解决方案2】:

你的连接字符串应该是这样的:

"ABCDB": "Data Source=xxx-test;Initial Catalog=abc;Integrated Security=SSPI;Persist Security Info=True;"

并添加您已发布的应用程序的应用程序池名称安全/用户数据库文件夹:

IIS APPPOOL\<apppool name>

或者使用用户名和密码向您的数据库添加一个新用户帐户。在这种情况下,您还必须更改连接字符串。

【讨论】:

  • 谢谢,仍然遇到同样的问题 用户 'DomainName\\MachineName$' 登录失败,在 Visual Studio 本地可以正常运行。
【解决方案3】:

我遇到了同样的问题。

  • 其他 .NET Core 3.1 Web 应用程序在同一服务器上的同一 IIS 实例上使用相同的身份验证方法(匿名身份验证)运行良好,使用相同的连接字符串到同一 MS SQL DB。
  • 对于这个特定的 .NET Core 3.1 Web 应用程序,IIS 导致该应用程序尝试使用用户名 {DOMAIN}\{Computer Name} 对 MSSQL DB 进行身份验证

对我来说,问题是有问题的一个应用程序的连接字符串有“Trusted_Connection=True”。

我知道我会使用 Integrated_Security 从 IIS 获取此身份验证拦截,但没有意识到 Integrated_SecurityTrusted_Connection 的同义词。

因此解决方法是从应用程序中的数据库连接字符串中删除 Trusted_Connection = True 或 Integrated_Security = True。 如果您需要这两者中的任何一个才能使您的代码正常工作(但要提供用户名和数据库连接字符串中的密码),您可能应该重新评估您的代码。否则,我和 OP 观察到的行为应该是您想要发生的,这不是问题。

【讨论】:

    猜你喜欢
    • 2020-10-01
    • 2021-01-11
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 2017-01-27
    • 2010-10-07
    相关资源
    最近更新 更多