Tedious: SQL 2014 的 Windows 身份验证问题

创建于 2015-02-13  ·  28评论  ·  资料来源: tediousjs/tedious

新的乏味,只是试图解决这个问题,让 Windows auth 连接到 SQL Server 2014-

繁琐的包版本:1.9.0
节点版本 12

// 配置设置
变量配置 = {
用户名:“用户”,
密码:“我的通行证”,
服务器:“我的服务器”,
域:“MyDomian”,
选项: {
数据库:“我的数据库”
},
调试:{
数据包:真实,
数据:真实,
有效载荷:真,
令牌:真实,
日志:真
}
};

我已经验证我能够连接到我的 1433 端口,并且为了测试这是一个本地运行的 SQL 服务器。

堆栈跟踪:
D:\开发\节点\node-sql\index.js:25
抛出错误;
^
ConnectionError:登录失败。
登录来自不受信任的域,不能用于
Windows 身份验证。
在解析器。
(D:\Development\Node\node-sql\node_modules\tedious\lib\connection.js:447:37)
在 Parser.emit (events.js:107:17)
在 Parser.nextToken
(D:\Development\Node\node-sql\node_modules\tedious\lib\token\token-stream-parser.js:91:18)
在 Parser.addBuffer
(D:\Development\Node\node-sql\node_modules\tedious\lib\token\token-stream-parser.js:68:17)
在 Connection.sendDataToTokenStreamParser
(D:\Development\Node\node-sql\node_modules\tedious\lib\connection.js:879:35)
在 Connection.STATE.SENT_NTLM_RESPONSE.events.data
(D:\Development\Node\node-sql\node_modules\tedious\lib\connection.js:226:23)
在 Connection.dispatchEvent
(D:\Development\Node\node-sql\node_modules\tedious\lib\connection.js:742:59)
在 MessageIO。
(D:\Development\Node\node-sql\node_modules\tedious\lib\connection.js:670:22)
在 MessageIO.emit (events.js:107:17)
在 MessageIO.eventData
(D:\Development\Node\node-sql\node_modules\tedious\lib\message-io.js:56:12)

任何朝着正确方向的推动都值得赞赏。

feature-request

最有用的评论

@arthurschreiber @arobson OMG 终于成功了!!! 非常感谢大家及时的支持!!! 所以这是我的最终配置:

var config = {
    "userName": "user.name",
    "password": "password",
    "server": "servername",
    "domain": "DOMAIN_NAME_CAPITALIZED_AND_NOT_FQDM",
    "options": {
        "encrypt": false
    }
};

我在虚拟机上使用 SQL Server 2008 R2。 该脚本位于托管数据库的同一台服务器上。

如果您可以将其添加到某处的文档中,那就太好了

所有28条评论

据我所知,我 PR 的修复尚未发布。 您看到的错误消息与我们尝试连接到具有某些安全限制的 AD 上的 SQL 服务器的内容一致。 我第一次添加 NTLM 支持并没有考虑到这一点,但新合并的行为应该考虑到这一点。 您是否尝试过 NPM 从主分支安装此库?

所以我从 master 分支中提取了最新的,并在本地编译它,因为 npm 实际上忽略了 lib 文件夹 - 但仍然没有乐趣。 用咖啡 1.9 编译它,它的编译方式与 npm 上的咖啡 1.7 略有不同。

我将继续这一点 - 还有其他想法吗?

我能够在 Azure 上使用 SQL Auth 进行此操作,但仍然无法使用 windows Auth 进行此操作,-我尝试使用当前源,该源在 npm 中没有更改,但这仍然无法正常工作,但可能是因为我缺乏构建咖啡脚本的经验-

使用咖啡 1.9 版 - 针对源代码运行以下内容。
coffee --copile --output lib src 然后将编译好的库放在 node_modules/tedious 中,但仍然不行-

你可以试试 1.10.0 版本吗?

我在最新版本的乏味中遇到了同样的问题。 我提供了工作站的名称,但仍然得到相同的“登录来自不受信任的域,不能用于 Windows 身份验证。”

关于域设置,我是否遗漏了一些东西,允许我从不属于域的计算机对 Windows 域用户进行身份验证? 我正在尝试将域用户从 Ubuntu 14.04 实例验证到 Windows 2012 R2 服务器上的 SQL Server 2014。

@arobson在另一条评论中,您说您遇到了同样的问题,在您的 PR 合并后,您能够在生产中成功进行身份验证。 除了繁琐之外,你有什么事情要做吗?

你还在为最新的繁琐版本遇到这个问题吗?

@arthurschreiber我刚刚尝试过,但我仍然遇到“登录来自不受信任的域,不能与 Windows 身份验证一起使用。” 错误信息。

@arobson似乎有一个解决方案,但我在任何地方都找不到。

对于我应该使用哪些选项来使用域凭据连接到我们的 SQL 2014 实例的任何帮助,我们将不胜感激。

也有这个问题。 我可以使用 SQL 用户登录,但不能使用 Windows 授权,不幸的是我的数据库团队不允许永久 SQL 用户,因此它需要使用 Windows 身份验证。 这些是我的配置选项:

变量配置 = {
服务器:“服务器名”,
用户名:用户',
密码:'密码',
域:'FQDN.DOMAIN.COM'
,选项: {
调试:{
数据包:真实,
数据:真实,
有效载荷:真,
令牌:假,
日志:真
},
数据库:'DB_NAME'
}
};

这是我得到的错误:

{ [连接错误:登录失败。 登录来自不受信任的域,不能用于 Windows 身份验证。]
名称:'连接错误',
消息:'登录失败。 登录来自不受信任的域,不能用于 Windows 身份验证。',
代码:'ELOGIN' }
{ [RequestError: 请求只能在 LoggedIn 状态下进行,不能在 SentNTLMResponse 状态下进行]
名称:“请求错误”,
message: '请求只能在 LoggedIn 状态下进行,不能在 SentNTLMResponse 状态下进行',
代码:'EINVALIDSTATE' }
{ [连接错误:登录失败。 登录来自不受信任的域,不能用于 Windows 身份验证。]
名称:'连接错误',
消息:'登录失败。 登录来自不受信任的域,不能用于 Windows 身份验证。',
代码:'ELOGIN' }
{ [RequestError: 请求只能在 LoggedIn 状态下进行,不能在 SentNTLMResponse 状态下进行]
名称:“请求错误”,
message: '请求只能在 LoggedIn 状态下进行,不能在 SentNTLMResponse 状态下进行',
代码:'EINVALIDSTATE' }

我的配置有问题吗?

不,我认为这不是您的配置的问题。 我需要在我的机器上安装 SQL Server 2014,看看是什么原因造成的。 也许身份验证方案发生了一些变化,我们还不支持。

我会看看我能做什么。

@jgornick @stefanTHD - 这是我在我们的环境中注意到的一些怪癖。 2012 年和 2014 年,NTLM 一直在 AD 之外的 Linux 机器上为我们工作,即使有非常严格的政策来防止不太安全的 NTLM 功能。

1 - 不要在域属性中使用 FQDN。 如果是“company.com”,请使用“COMPANY”
2 - 大写似乎也很重要。 我们在全大写域名方面取得了成功
3 - _不要_使用限定的用户名(即“[email protected]”)只是“user.name”

供参考

NTLM 文档很旧,Microsoft 不提供。 我不得不对某些二进制标志进行大量研究,因为我找到的文档没有解释其中一些标志的用途。 我的第一个 PR 只针对我们的工作站上的 SQL Server 使用 NTLM,因为我们的 AD 有一个禁用某些 NTLM 功能的策略。

下一步

如果上面的 3 个提示不起作用,如果您可以通过 Even Viewer / SQL Logs 找到失败的登录条目,那将非常有帮助。 “不受信任的域”实际上是 MSFT 提供的一个通用错误,使攻击者更难知道他们的请求被拒绝的原因。 您甚至可以搜索该错误并找到其他试图支持 NTLM 的 OSS 库抱怨该错误具有误导性。

我想帮你解决这个问题,Tedious 很棒, @arthurschreiber最近的贡献使它变得更好。

NTLM 身份验证在 Microsoft 的MS-NLMP文档中进行了描述。 我会看看我是否能抽出时间来通读它,并将它与迄今为止实现的繁琐内容进行比较。

@arthurschreiber @arobson OMG 终于成功了!!! 非常感谢大家及时的支持!!! 所以这是我的最终配置:

var config = {
    "userName": "user.name",
    "password": "password",
    "server": "servername",
    "domain": "DOMAIN_NAME_CAPITALIZED_AND_NOT_FQDM",
    "options": {
        "encrypt": false
    }
};

我在虚拟机上使用 SQL Server 2008 R2。 该脚本位于托管数据库的同一台服务器上。

如果您可以将其添加到某处的文档中,那就太好了

凉爽的! NTLM 身份验证不适用于加密这一事实是代码中的一个错误,我会尽快提供修复(如果我能找到一些时间)。

确实,将域名大写确实可以解决问题!

https://github.com/pekim/tedious/pull/367修复了 NTLM 身份验证无法使用加密的问题。

这个讨论是指在 Linux 中使用 Windows 身份验证吗? 例如红帽?

@pisees是的,我正在使用带有修复加密的 Windows Auth 从 Fedora 22 连接到 SQL 服务器。

我在@NamTThai遇到了完全相同的问题,在我阅读了这篇文章并按照描述更改了域之后,它现在正在工作。 (全部大写,只有域的第一部分,省略点后面的部分)

我在微软工作,希望能帮助解决一些乏味的问题。
这个问题还有什么悬而未决的问题还是全部解决了?

@tvrprasad我认为有一种变通方法,我不确定我们都理解为什么变通方法有效。 :)

@benzou@arobson在 8 月 15 日在此线程中描述的解决方法吗?
是什么阻止了这个问题被关闭? 也许我可以帮助关闭这个......不知何故:)

@tvrprasad我认为我们需要更好的文档来解决这个问题。

我们的文档存储在这个 repo 的gh-pages分支中,但是由于它是在代码库之外维护的,所以它很容易过时并且维护很麻烦。 😞

@tvrprasad - 自从我添加 NTLM 支持以来,报告给乏味和我们的回购序列的问题一直是由于域被指定为小写和/或 FQDN。 对此的一种解决方案可能是跟进一个 PR:

  1. 将域转换为大写(我应该刚开始这样做)
  2. .上拆分域并且仅使用第一段

我当然不是 NTLM 专家,但我们是 MSSQL 和 Node 的粉丝,并且确实需要这个,所以我深入研究 NTLM 文档和其他实现,在我们的运营团队的帮助下,针对许多 SQL Server 进行测试。版本,所以我们可以对实施相对有信心。 您可以提供的任何分析和改进都会很棒。 不知道我可能错过了什么,因为我遵循的文档是 2007 年的😄

如果有关于 NTLM 位的具体问题我可以回答,请告诉我。

@arobson - FDQN 似乎对我有用,但仍然只有大写。 我创建了一个单独的问题来转换为大写以便于跟踪 - https://github.com/tediousjs/tedious/issues/414。 我会为此整理一个 PR。 我将尝试了解为什么小写不起作用。

@arthurschreiber - 一旦我能够通过该主题获得至少一个 PR,我将尝试帮助更新文档,以便我有更好的理解。 如果还有其他地方缺少文档,请告诉我。 我会尽力帮忙的。

我打开了其他几个与身份验证相关的问题。 我很感激对这些的想法。
https://github.com/tediousjs/tedious/issues/415
https://github.com/tediousjs/tedious/issues/416

伙计们 - 我有一个用于实施 Windows 集成身份验证的 PR - https://github.com/tediousjs/tedious/pull/497。 这不需要用户名或密码,并使用用户的登录凭据。

如果您能够尝试并提供反馈,我将非常感激。 我期待与社区合作以实现该功能。

您好,如果有人可以帮助我,我尝试在 MS SQL Server 数据库 12 中使用 mssql 节点 4.1 进行连接,我已经尝试了很多东西,但无法连接

我的连接符合以下要求:

x

我尝试:

const stringConnect = '服务器 = ADMIN-CCE \ admin: 1433; 数据库 = GRD; 用户id = admin-cce \ admin; '
DATABASE.connect (stringConnect)
.then (conn => {
全局.conn = conn;
console.log('连接到 GRD');
})
.catch (err => console.error ( connection error mssql $ {stringConnect} - $ {err} ));

module.exports = 数据库;

*返回错误 **
mssql 连接错误 Server = ADMIN-CCE \ admin: 1433; 数据库 = GRD; 用户id = admin-cce \ admin; - ConnectionError:管理员端口:在 ADMIN-CCE 中找不到 1433

已经尝试过其他方法,也没有成功! 看:

变量配置 = {
服务器:“ADMIN-CCE\MSSQLSERVER”,
数据库:“GRD”,
端口:1433,
用户:'admin-cce\admin',
调试:是的,
选项: {
加密:假,
可信连接:真
}
};

DATABASE.connect(配置,功能(错误){
如果(错误)
{
控制台日志(错误)
}
别的
console.log ('已连接.....')
});

module.exports = 数据库;

* 返回错误 *
信息:
'无法连接到 ADMIN-CCE:未定义 - 无法连接(序列)',
代码:'ESOCKET'},
名称:'连接错误'}

@allexon ,繁琐还不支持 Windows 集成身份验证,详细信息在https://github.com/tediousjs/tedious/issues/660。

繁琐的支持SQL server windows 身份验证了吗?

此页面是否有帮助?
0 / 5 - 0 等级