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

时间:2011-05-04 21:39:47

标签: sql-server sql-server-2005 cross-domain windows-authentication

我有一个使用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实例时,他会收到以下错误消息:

  

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

我尝试过的其他事情:

  • 如果我将用户添加为登录名 显然,他可以连接。

  • 如果我添加Domain1全局组 用户是登录的成员 显然,他可以连接。

  • 如果我添加Domain1全局组 用户所属的成员 Domain2域本地成员 用作登录的组,他不能 连接。

  • 编辑:如果我将Domain2域本地组添加到托管SQL Server实例的Domain2服务器上的Demote Desktop Users组,则{{ 1}}用户可以成功连接到服务器 - 我也可以作为Domain1用户本地连接到实例(不是远程)。

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

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


根据我的理解(引用这些TechNet文章:Group ScopeNesting Groups),域组必须是域本地组才能包含来自Domain1和{{{}的用户1}}。

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

更多说明

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

更新

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

2 个答案:

答案 0 :(得分:16)

正如我的问题更新中所述,将服务帐户更改为Domain2可以解决问题。那是怎么回事?

问题 - 解释

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

整体解决方案

要将所有内容整合在一起,要成功添加Domain1Domain3中的用户作为Domain2中的群组成员,以便这些群组可以用作Windows身份验证的SQL Server登录,这是一份要求清单(或者至少是强烈鼓励的):

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

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

答案 1 :(得分:1)

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

我的环境,

  

Forest 1(Domain1)--- TRUST --- Forest 2(Domain2)

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

并弹出以下错误消息。

  

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

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

  

信托 - &gt;传出信托 - &gt;属性 - &gt;身份验证 - &gt;更改为“森林范围的身份验证”

我的问题解决了。