Node.js 客户端中的 Windows 集成身份验证

2024-05-12

当使用node.js作为客户端时,是否可以使用Windows集成身份验证连接到服务器(例如连接到IIS时)?

我对此的搜索仅出现使用 node.js 作为服务器的结果。


2015 年更新:现在有一些模块实现了 Windows 集成身份验证。节点-sspi https://www.npmjs.com/package/node-sspi使用 SSPI(Windows 安全 API)来处理服务器端的事情,但是不进行客户端身份验证 https://github.com/abbr/NodeSSPI/issues/10。有几个客户端实现 https://www.npmjs.com/search?q=ntlm例如http-ntlm https://github.com/SamDecrock/node-http-ntlm,但它们并没有真正集成,因为它们需要用户密码——它们不使用 SSPI 进行透明身份验证。

2019年更新:似乎可以使用kerberos https://github.com/mongodb-js/kerberos使用 SSPI 进行真正的 Windows 集成 HTTP 身份验证的库(即使用节点进程的令牌进行透明身份验证)。看Kerberos 代理 https://www.npmjs.com/package/kerberos-agent。显然,这使用 Kerberos 而不是 NTLM/Negotiate,因此这可能有效也可能无效,具体取决于您的具体情况。


“Windows 集成身份验证”就是所谓的 NTLM 身份验证。当您从 IIS 收到带有以下内容的 HTTP 401 时:WWW-Authenticate标头包含NTLM,您现在可以享受实现 NTLM 身份验证协议的乐趣了。引用自本文档有关 NTLM 身份验证协议 http://davenport.sourceforge.net/ntlm.html#ntlmHttpAuthentication:


  1. 客户端向服务器请求受保护的资源:

    GET /index.html HTTP/1.1
    
  2. 服务器响应一个401status,表明客户端必须进行身份验证。NTLM通过以下方式呈现为受支持的身份验证机制WWW-Authenticate标头。通常,服务器此时关闭连接:

    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: NTLM
    Connection: close
    

    请注意,如果 NTLM 是第一个提供的机制,Internet Explorer 将仅选择它;这与 RFC 2616 不一致,RFC 2616 规定客户端必须选择支持的最强身份验证方案。

  3. 客户端重新提交请求Authorization标题包含一个类型 1 消息 http://davenport.sourceforge.net/ntlm.html#theType1Message范围。类型 1 消息采用 Base-64 编码进行传输。从此时起,连接将保持打开状态;关闭连接需要重新验证后续请求。这意味着服务器和客户端必须通过 HTTP 1.0 样式的“Keep-Alive”标头或 HTTP 1.1(默认情况下使用持久连接)支持持久连接。相关请求头如下:

    GET /index.html HTTP/1.1
    Authorization: NTLM TlRMTVNTUAABAAAABzIAAAYABgArAAAACwALACAAAABXT1JLU1RBVElPTkRPTUFJTg==
    
  4. 服务器回复一个401状态包含类型 2 消息 http://davenport.sourceforge.net/ntlm.html#theType2Message in the WWW-Authenticate标头(同样是 Base-64 编码)。如下所示。

    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: NTLM TlRMTVNTUAACAAAADAAMADAAAAABAoEAASNFZ4mrze8AAAAAAAAAAGIAYgA8AAAARABPAE0AQQBJAE4AAgAMAEQATwBNAEEASQBOAAEADABTAEUAUgBWAEUAUgAEABQAZABvAG0AYQBpAG4ALgBjAG8AbQADACIAcwBlAHIAdgBlAHIALgBkAG8AbQBhAGkAbgAuAGMAbwBtAAAAAAA=
    
  5. 客户端通过重新提交请求来响应类型 2 消息Authorization包含 Base-64 编码的标头类型 3 消息 http://davenport.sourceforge.net/ntlm.html#theType3Message:

    GET /index.html HTTP/1.1
    Authorization: NTLM TlRMTVNTUAADAAAAGAAYAGoAAAAYABgAggAAAAwADABAAAAACAAIAEwAAAAWABYAVAAAAAAAAACaAAAAAQIAAEQATwBNAEEASQBOAHUAcwBlAHIAVwBPAFIASwBTAFQAQQBUAEkATwBOAMM3zVy9RPyXgqZnr21CfG3mfCDC0+d8ViWpjBwx6BhHRmspst9GgPOZWPuMITqcxg==
    
  6. 最后,服务器验证客户端类型 3 消息中的响应并允许访问资源。

     HTTP/1.1 200 OK
    

你必须弄清楚你将如何回复类型 2 消息的质询 http://davenport.sourceforge.net/ntlm.html#respondingToTheChallenge,其中用户的密码经过 MD4 哈希处理并用于创建 DES 密钥来加密质询数据。

我不确定您如何访问登录用户的凭据数据,这将允许您完成此操作,尽管我确信这将涉及编写一个原生 C++ 插件 http://nodejs.org/api/addons.html这样您就可以与必要的 Windows API 进行对话。或者,我想您可以只询问用户的密码。

或者,你可以通过为您处理 NTLM 混乱的软件代理您的 Node 请求 http://ntlmaps.sourceforge.net/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js 客户端中的 Windows 集成身份验证 的相关文章

随机推荐