Windows集成身份验证在客户端的Node.js(Windows Integrated Authe

2019-07-05 20:23发布

当使用Node.js的作为客户端,有没有可能使用Windows集成身份验证连接到服务器(例如连接到IIS时)?

我给这家只转了结果,其中Node.js的搜索用作服务器。

Answer 1:

更新:现在有实现Windows集成身份验证一些模块。 节点SSPI使用SSPI(Windows安全API)来处理事物的服务器端,但没有做客户端验证 。 有几个客户端实现 ,如HTTP-NTLM ,但它们不是真正整合,因为它们需要用户密码-他们不使用SSPI做透明的权威性。


“Windows集成身份验证”是什么被称为NTLM身份验证。 当您从IIS接收HTTP 401与WWW-Authenticate含头NTLM ,您现在可以实施NTLM身份验证协议的乐趣。 从引用该文件有关NTLM身份验证协议 :


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

     GET /index.html HTTP/1.1 
  2. 服务器回应一个401状态,表示客户端必须进行身份验证。 NTLM被呈现为经由支持的认证机制WWW-Authenticate报头。 通常,服务器在此期间关闭的连接:

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

    需要注意的是Internet Explorer将只能选择NTLM如果是首次提供机制; 这是与RFC 2616,其中规定,客户必须选择最强支持的身份验证方案的赔率。

  3. 客户端重新提交带有所述请求Authorization包含一个首标类型1的消息参数。 在类型1的消息是base-64编码用于传输。 从这点出发,连接保持打开; 关闭连接需要后续请求重新进行身份验证。 这意味着,在服务器和客户端必须支持持久连接,经由任一HTTP 1.0式“保持活动”头或HTTP 1.1(其中持续连接默认使用)。 相关的请求头显示如下:

     GET /index.html HTTP/1.1 Authorization: NTLM TlRMTVNTUAABAAAABzIAAAYABgArAAAACwALACAAAABXT1JLU1RBVElPTkRPTUFJTg== 
  4. 服务器用回复401含有状态类型2消息在WWW-Authenticate标题(再次,BASE-64编码)。 这如下所示。

     HTTP/1.1 401 Unauthorized WWW-Authenticate: NTLM TlRMTVNTUAACAAAADAAMADAAAAABAoEAASNFZ4mrze8AAAAAAAAAAGIAYgA8AAAARABPAE0AQQBJAE4AAgAMAEQATwBNAEEASQBOAAEADABTAEUAUgBWAEUAUgAEABQAZABvAG0AYQBpAG4ALgBjAG8AbQADACIAcwBlAHIAdgBlAHIALgBkAG8AbQBhAGkAbgAuAGMAbwBtAAAAAAA= 
  5. 客户端通过重新提交与该请求响应类型2消息Authorization含有碱-64编码报头类型3消息 :

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

      HTTP/1.1 200 OK 

你必须弄清楚你将如何回复类型2消息的挑战 ,其中用户的密码哈希MD4和用于创建DES密钥来挑战数据进行加密。

我不知道你是如何访问登录的用户的凭证数据,这将允许你做到这一点,但我敢肯定,这将涉及编写本地C ++的插件 ,所以你可以跟必要的Windows API。 或者,我想你可以只要求用户的密码。

或者,也可以代理通过处理NTLM烂摊子你软件的节点的请求 。



Answer 2:

对于Kerberos:

  • 节点SSPI

     Just on windows No client side node Supports NTLM too 
  • 护照协商

     Needs python on the server it's a passportJs strategy 

对于NTLM

  • 节点SSPI

     Just on windows No client side node Supports Kerberos too 
  • httpntlm
  • EXPRESS-NTLM
  • 请求NTLM
  • NTLM

     experimental project! 
  • NTLM的身份验证

      experimental! 
  • 护照NTLM

      supports SMB protocol it's a passportJs strategy 

我选择了Kerberos的护照协商,并表示,对于NTLM NTLM



Answer 3:

对于客户端,有什么工作原理是利用节点的libcurl做REST / HTTP调用。

这里的示例代码:

var endpoint = urlString;
var url = require("url");
var endpointUrl = url.parse(endpoint);

var Curl = require( 'node-libcurl' ).Curl;
var curl = new Curl();

curl.setOpt( 'USERNAME', '' );
//curl.setOpt( 'VERBOSE', 1 );
curl.setOpt( 'URL', endpoint );
curl.setOpt( 'HTTPAUTH', Curl.auth.NEGOTIATE );
curl.setOpt( 'NOPROXY', endpointUrl.hostname );

curl.on( 'end', function( statusCode, body, headers ) {

    if (statusCode === 200) {
        console.log(body);
        cb(null, { statusCode, body, headers } ); 
    } else {
        cb(new Error(), { statusCode, body, headers } ); 
    }

    this.close();
});

curl.on( 'error', curl.close.bind( curl ) );
curl.perform();


文章来源: Windows Integrated Authentication in node.js Client