当使用node.js作为客户端时,是否可以使用Windows集成身份validation连接到服务器(例如连接到IIS时)?
我的search只有node.js被用作服务器的结果。
更新:现在有一些实现Windows集成身份验证的模块。 node-sspi使用SSPI(Windows安全API)来处理事物的服务器端,但不执行客户端认证 。 有几种客户端实现,例如http-ntlm ,但由于它们需要用户密码,因此它们并不真正集成 – 它们不使用SSPI进行透明认证。
“Windows集成身份验证”就是所谓的NTLM身份验证。 当您从IIS收到一个包含NTLM
的WWW-Authenticate
标头的HTTP 401时,您现在就有了实现NTLM身份验证协议的乐趣。 从这个关于NTLM认证协议的文档引用:
客户端向服务器请求受保护的资源:
GET /index.html HTTP/1.1
服务器响应401
状态,指示客户端必须进行身份验证。 NTLM
通过WWW-Authenticate
报头作为受支持的验证机制提供。 通常,服务器此时关闭连接:
HTTP/1.1 401 Unauthorized WWW-Authenticate: NTLM Connection: close
请注意,Internet Explorer将只选择NTLM,如果它是第一个提供的机制; 这与RFC 2616不符,RFC 2616指出客户端必须选择支持最强的认证方案。
客户端重新提交包含Type 1消息参数的Authorization
标头的请求。 类型1消息是Base-64编码传输。 从这一点来看,这个连接是敞开的。 关闭连接需要重新认证后续的请求。 这意味着服务器和客户端必须通过HTTP 1.0样式的“Keep-Alive”头或HTTP 1.1(默认情况下使用持久连接)支持持久连接。 相关的请求标题如下所示:
GET /index.html HTTP/1.1 Authorization: NTLM TlRMTVNTUAABAAAABzIAAAYABgArAAAACwALACAAAABXT1JLU1RBVElPTkRPTUFJTg==
服务器在WWW-Authenticate
报头(同样是Base-64编码)中回复一个包含Type 2消息的401
状态。 如下所示。
HTTP/1.1 401 Unauthorized WWW-Authenticate: NTLM TlRMTVNTUAACAAAADAAMADAAAAABAoEAASNFZ4mrze8AAAAAAAAAAGIAYgA8AAAARABPAE0AQQBJAE4AAgAMAEQATwBNAEEASQBOAAEADABTAEUAUgBWAEUAUgAEABQAZABvAG0AYQBpAG4ALgBjAG8AbQADACIAcwBlAHIAdgBlAHIALgBkAG8AbQBhAGkAbgAuAGMAbwBtAAAAAAA=
客户端通过使用包含Base-64编码类型3消息的Authorization
标头重新提交请求来响应类型2 消息 :
GET /index.html HTTP/1.1 Authorization: NTLM TlRMTVNTUAADAAAAGAAYAGoAAAAYABgAggAAAAwADABAAAAACAAIAEwAAAAWABYAVAAAAAAAAACaAAAAAQIAAEQATwBNAEEASQBOAHUAcwBlAHIAVwBPAFIASwBTAFQAQQBUAEkATwBOAMM3zVy9RPyXgqZnr21CfG3mfCDC0+d8ViWpjBwx6BhHRmspst9GgPOZWPuMITqcxg==
最后,服务器验证客户端类型3消息中的响应,并允许访问资源。
HTTP/1.1 200 OK
你必须弄清楚你将如何回复类型2消息的挑战 ,用户的密码是MD4哈希,并用于创建DES密钥来加密质询数据。
我不确定如何访问登录用户的凭证数据,这将允许您完成此操作,尽管我确信它将涉及编写本地C ++插件,以便您可以与必要的Windows API交谈。 或者,我想你可以问问用户的密码。
或者,您可以通过为您处理NTLM混乱的软件代理您的节点请求 。
对于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
NTLM
experimental project!
NTLM的身份验证
experimental!
护照NTLM
supports SMB protocol it's a passportJs strategy
我选择了Kerberos的passport-negotiate和NTLM的express-ntlm