.net - 由于不受信任的域,SQL 登录失败

标签 .net sql-server active-directory

  • 我有一个虚拟机,其中包含 SQL 服务器和 IIS 服务器。
  • 我的 IIS 服务器有一个运行 .NET Web 应用程序的应用程序池。
  • 此应用程序池身份为domain\account1
  • 我的应用程序 web.config 连接字符串具有“Trusted_Connection=True”和数据 来源=NAME\INSTANCE01
  • My SQL Server 启用了“SQL Server 和 Window 身份验证模式”。帐户domain\account1 已添加到数据库安全登录。
  • 我可以使用domain\account1通过RDP连接到该虚拟机,并且可以使用以下命令通过短信连接到数据库 Window 身份验证并连接到 NAME\INSTANCE01
  • 我确认我们的 AD 和 DC 上只有一个域。

但是,当我尝试登录 Web 应用程序时,.NET 错误跟踪显示登录失败。 查看数据库日志后,我看到以下错误。该错误似乎表明我在 .NET 应用程序中使用的身份用户 (domain\account1) 由于此错误而无法登录数据库。

enter image description here

这一直令人困惑,因为我进行了研究,发现只有当您从外部域连接时才会出现此错误,但我不知道为什么在我的情况下会显示此错误。

我尝试查看我的 AD,但看起来它已启动,因为如果没有启动,我将无法首先使用 domain\account1 通过 RDP 访问虚拟机。

非常欢迎任何可以帮助我缩小问题范围的指导。

最佳答案

根据我们的对话,一个可能适用的常见原因是 SQL Server 没有注册服务主体名称。这是 kerberos 正常工作所需要的。

为此,您可以使用 setspn 实用程序。

文档中有很多内容,这里是基础知识。服务主体名称适用于某个特定机器和端口上的某个特定服务(例如,sql server)、某个特定域帐户。假设您的服务器计算机名称是 MyServer,运行 SQL Server 实例的帐户是 MyDomain\SQLAccount,并且它是一个默认实例(在端口 1433 上运行)。如果它是命名实例,请通过 sql 配置管理器或查看sql 日志的开头并在下面替换它)

要查看分配给帐户的 SPN 列表,您可以使用

setspn -l MyDomain\SQLAccount

要为 SQL Server 服务注册 SPN,最好注册 netbios 名称和完全限定名称:

setspn -a MSSQLSvc/MyServer:1433 MyDomain\SQLAccount
setspn -a MSSQLSvc/MyServer.mydomain.com:1433 MyDomain\SQLAccount

现在,如果您有多个域 Controller ,则 SPN 可能需要一段时间才能在域中复制。因此,您必须等待“足够长的时间”才能看到此效果。 15分钟是常见的,30分钟绝对是安全的。因此,运行此命令后,等待一段时间,然后与 SQL Server 建立连接(使用例如 SSMS 和 Windows 身份验证)和 select auth_scheme from sys.dm_exec_connections where session_id = @@spid再次。如果您看到“kerberos”,则说明它起作用了。您还可以运行 klist purge从命令行清除您的票证,但这通常不是必需的,如果票证尚未复制,它也无济于事。

这并不是您遇到 SSPI 问题的唯一可能原因 - 请参阅 MS 博客了解更多信息。但这是一种非常常见的现象。

编辑:

Kerberos 问题通常仅在您拥有“双跳”凭据时才会发生。例如,从用户的计算机到 Web 服务器,然后从 Web 服务器到 SQL Server。这不适用于您的具体情况。但无论如何我仍然会尝试这个 SPN 设置,因为它是 SSPI 错误的常见来源。

关于.net - 由于不受信任的域,SQL 登录失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62839162/

相关文章:

sql-server - 我可以在 SQL Server 数据库中使用带有可能点的 varchar 类型的变量吗?

linux - 如何正确连接 FreeIpaClient api 2.164 和 FreeIpaServer api 2.156

c# - 如何使用 C# 登录 Active Directory?

c# - '|' vs ' ||' C#中的编译器优化

.net - 如何监听任何端口上的广播数据包?

c# - 为什么 DevExpress Treelist 会定期抛出 HideException?

用于解析存储过程和提取元数据的 C# 脚本

sql - 带参数和不带参数的查询 -> 完全不同的执行时间

ios - Mobileiron:Active Directory 中的 iOS 应用程序授权

c# - 如何按日、周、月自动发送邮件?