使用 Windows 身份验证的跨域 SQL Server 登录

Posted

技术标签:

【中文标题】使用 Windows 身份验证的跨域 SQL Server 登录【英文标题】:Cross Domain SQL Server Logins Using Windows Authentication 【发布时间】:2011-08-18 21:51:35 【问题描述】:

我有一个使用 Windows 身份验证的 SQL Server 2005 命名实例,其中域组用作登录名。域结构如下:

      Forest1                Forest2
      /      \                  |
Domain1       Domain2        Domain3

对象按以下域进行组织:

Forest1.Domain1

用户 全球组

Forest1.Domain2

SQL Server 实例 域本地组(用作登录)

Forest2.Domain3

用户 全球组

我的所有用户都存在于Domain1Domain3 中,但SQL Server 框存在于Domain2 中。因此,我的登录名是Domain2 中的域组。当Domain1 中的用户添加到Domain2 中的域本地组并尝试使用 TCP/IP 协议连接到 SQL Server 实例时,他会收到以下错误消息:

无法连接到 。用户 'Domain1\userName' 登录失败。 (Microsoft SQL Server,错误:18456)

我尝试过的其他事情:

如果我将用户添加为登录 明确地说,他可以连接。

如果我添加一个 Domain1 全局组 用户作为登录名的成员 明确地说,他可以连接。

如果我添加一个 Domain1 全局组 用户是其中的成员 Domain2 域本地成员 组用作登录,他不能 连接。

编辑:如果我将Domain2域本地组添加到托管SQL Server实例的Domain2服务器上的降级桌面用户组,Domain1用户可以成功连接到服务器 - 我也可以作为 Domain1 用户在本地连接到实例(只是不能远程)。

编辑:如果我将 Domain2 域本地组添加到本地服务器组并为该本地服务器组创建 SQL Server 登录,Domain1 用户仍然无法连接远程到实例。

编辑:如果我将连接网络协议更改为“命名管道”,Domain1 用户可以成功远程连接。


据我了解(参考这些 TechNet 文章:Group Scope 和 Nesting Groups),域组必须是域本地组才能包含来自 Domain1Domain3 的用户。

如何使用 Windows 身份验证将域组用作 SQL Server 登录名,以便域组可以包含来自 Domain1Domain3 的用户,并且用户可以通过 TCP/IP 远程连接?

更多注释

SQL Server 命名实例的服务帐户是Domain1 中的用户帐户 已为服务帐户添加 SPN(包括服务器名称和别名)

更新

将 SQL 服务实例服务帐户更改为 Domain2 似乎已经解决了这个问题。我会进一步调查并将我的发现发回!

【问题讨论】:

【参考方案1】:

好的,我在 2017 年也遇到了这个问题,很难找到任何解决方案,最后,我只为我的情况解决了这个问题。

我的环境,

林 1(域 1)--- 信任 --- 林 2(域 2)

我在 Domain2 中有一个服务帐户,尝试使用 Windows 身份验证登录 Domain1 中的 SQL Server。

然后,会弹出以下错误消息。

登录失败。登录来自不受信任的域,不能用于 Windows 身份验证。 (Microsoft SQL Server,错误:18452)

解决方案很简单,在 domain1 上,打开活动目录域和信任工具,

信任 -> 传出信任 -> 属性 -> 身份验证 -> 更改为“森林范围的身份验证”

我的问题解决了。

【讨论】:

【参考方案2】:

正如我在问题更新中提到的,将服务帐户更改为 Domain2 解决了该问题。那到底是怎么回事?

问题 - 解释

据我所知(也在 Microsoft 代表的帮助下),因为服务帐户最初是 Domain1 用户,所以当用户进行身份验证时,它无法确定连接用户是哪些域本地组的成员通过 Kerberos。这是 Kerberos 问题的主要线索是当我使用“命名管道”成功连接时,因为它使用 NTLM 身份验证。

整体解决方案

为了将这一切结合在一起,要成功地将来自Domain1Domain3 的用户添加为Domain2 中的组成员,以便可以将这些组用作具有Windows 身份验证的SQL Server 登录名,这里有一个要求列表(或至少强烈鼓励):

    在域之间建立信任关系
      至少必须设置 1 路信任,以便 Domain2 信任 Domain1Domain3
    Domain2 中的组必须在“域本地”范围内
      这样您就可以从Domain1Domain3 添加用户和组 请参阅here 了解更多信息
    使用 SQL Server 配置管理器将非管理 Domain2 用户指定为服务帐户标识
      MSDN 记录了为什么可能首选使用域用户帐户 尽管配置管理器应该为您将用户添加到本地 SQL Server 2005 特定组(即 SQLServer2005MSSQLUser$MY_MACHINE$MY_INSTANCE),但我遇到了一些情况并非如此。因此,只需检查您的本地群组,以确保它们已使用您的 Domain2 用户帐户进行了适当更新。 虽然 SQL Server 设置应自动为其本地组分配适当的权限,但我再次遇到了一些情况并非如此。如果您遇到这种情况,您可以参考这篇MSDN 文章以及前面提到的文章以了解权限要求。
    为 SQL Server 实例主机(包括任何别名)和 Domain2 服务帐户配置服务主体名称 (SPN)
      客户端和服务器主机之间的相互身份验证需要 SPN 查看这篇TechNet 文章了解更多信息
    根据您打算如何使用模拟,您可能希望启用 Domain2 服务帐户以进行委派信任
      查看这篇TechNet 文章了解更多信息
    为 SQL 服务实例启用远程连接 最后,为所需的Domain2 组创建登录名,任何Domain1Domain3 成员都应该能够远程连接!

注意

与任何远程网络活动一样,请检查您的防火墙以确保您的 SQL Server 端口未被阻止。虽然默认端口是 1433,但请检查以确保您的端口是明文的。

【讨论】:

以上是关于使用 Windows 身份验证的跨域 SQL Server 登录的主要内容,如果未能解决你的问题,请参考以下文章

验证来自 Javascript 的跨域请求

带 Cors 的跨域请求

使用 FormsAuthentication 的跨域 Cookie

JWT跨域身份验证解决方案

AngularJS 中的跨域 HTTP 请求失败

掌握基于 JWT 实现的 Token 身份认证