【问题标题】:C# - System.Data.SqlClient.SqlException: 'Failed to generate SSPI context.'C# - System.Data.SqlClient.SqlException:“无法生成 SSPI 上下文。”
【发布时间】:2018-02-28 13:47:17
【问题描述】:

尝试从 IIS Express 运行我的 .NET Core 2.0 应用程序时,我收到以下错误:

System.Data.SqlClient.SqlException: 'Failed to generate SSPI context.'

当尝试使用以下连接字符串(用户名和密码已编辑)访问 SQL 2012 数据库服务器上的数据库时会发生这种情况:

"Server=10.10.127.170;Database=NGProd;user 
id=*;password=*;Trusted_Connection=True;MultipleActiveResultSets=true;"

我正在使用专门为此应用创建的 SQL Server 登录名和密码。我可以使用它登录 SSMS 并拥有对数据库的所有访问权限。我可以在其他计算机上测试连接,它工作正常。我还检查了 SQL 错误日志,当我尝试通过应用程序或通过 SSMS 登录时没有报告错误。

我浏览了几个博客、网站和论坛来查看“无法生成 SSPI 上下文”错误,但这些解决方案都没有任何效果。

有人有什么想法吗?我被难住了!

【问题讨论】:

  • 此异常可能会导致大量问题。原因之一可能是-您尝试使用不在活动目录下的计算机的域凭据连接到远程服务器。您确定在连接字符串中使用了 sql 凭据吗?
  • 是的,它是 SQL Server 登录而不是域登录。我自己在 SQL 服务器上设置它并确认它可以工作。我什至已经确认它可以在不在域中的计算机上的 SSMS 中运行,只是在我的应用程序中不起作用。

标签: c# asp.net-core-2.0


【解决方案1】:

在您的连接字符串中设置参数Trusted_Connection=False。或者,如果存在Integrated Security,请将其设置为False

【讨论】:

  • Integrated Security=False 也有帮助
  • 或者,如果您想使用 Windows 身份验证连接,您可以在 Credential Manager 中启用此功能。使用数据库 url(或 ip?),然后添加带有冒号的端口,如 :1433,并添加您的用户名和密码。
【解决方案2】:

如前所述,它可能是由一系列问题引起的。其中之一是 IIS 中的 AppPool 帐户。确认它有permissions,或者您可以将其从默认的内置帐户更新为您想要访问服务器的帐户。在与您的应用绑定的应用池下,访问Advanced Settings > Process Model > Identity。然后选择自定义帐户并输入您的服务器帐户。请看下面的截图。

【讨论】:

  • 太棒了,除了我现在从 IIS Express 运行它,所以这没有帮助。
  • 我以自己的身份运行应用程序池,并且我的密码已过期。直到我读到这个我才意识到这一点。使用我的新密码“登录”回到应用程序池已修复它。谢谢!
【解决方案3】:

您正在混合凭据类型。您应该或者使用集成安全性(也称为 Windows 身份验证)用户名和密码,而不是同时使用两者。要么使用Trusted_Connection=true 并在远程服务器上授予您的个人用户授权(我猜现在不是这种情况),或者设置Trusted_Connection=false 并使用授权用户的用户名和密码。

另外,作为旁注,这已经在另一个答案中指出,但是,虽然IIS Express runs under your user account,但在部署到远程 IIS 服务器后,不一定就是这种情况。如果您在 IIS 服务器和远程 SQL Server 实例之间使用集成安全性,则需要向 IIS 服务器本身授予登录权限才能使其正常工作(或者让它在 App Pool 用户以外的其他用户下运行,这只是一个虚拟帐户,在 Active Directory 中没有实际用户)。

如果您使用的是用户名和密码,则上一段没有问题,但显然您需要安全地存储连接字符串。

【讨论】:

    【解决方案4】:

    我最近遇到了同样的问题。我从连接字符串中删除了 Trusted_Connection 部分:

    "Server=10.10.127.170;Database=NGProd;user id=*;pwd=*;"
    

    它对我有用。

    【讨论】:

      【解决方案5】:

      Trusted_Connection 应设置为 false:

      Trusted_Connection=False
      

      【讨论】:

        【解决方案6】:

        在尝试了我能找到的每一篇博文和建议之后,我费尽心思,花了好几个小时的时间,终于有了一个疯狂的想法。我只是使用我创建的 SQL Server 凭据将远程 SQL 服务器链接到我的本地 SQL 实例。砰!现在工作起来就像一个魅力,即使我必须在我的查询中写一些额外的内容。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-25
          • 1970-01-01
          • 2013-11-19
          • 1970-01-01
          • 2023-04-04
          • 1970-01-01
          相关资源
          最近更新 更多