我想知道是否有人知道无需托管在 ASP 站点上即可使用 Windows 身份验证的方法。这是一个可以访问 LDAP 的内部网,所以我想知道是否有办法强制客户端向我提供数据,就好像它来自 ASP 站点一样。我只需要登录域和用户名,就可以从那里运行。在 Ubuntu 上使用 Node.js。任何人都有这方面的经验吗?
最佳答案
更新:现在有a module that implements Windows-integrated authentication .
在您的 401
响应中,您需要提供一个值为 NTLM
的 WWW-Authenticate
header ,它通知浏览器他们需要发送 Windows 凭据。
response.writeHead(401, {
'WWW-Authenticate': 'NTLM',
});
然后您可以享受实现 NTLM 身份验证的乐趣。引自 this document about the NTLM authentication protocol :
客户端向服务器请求 protected 资源:
GET /index.html HTTP/1.1
服务器以
401
状态响应,表示客户端必须进行身份验证。NTLM
通过WWW-Authenticate
header 呈现为受支持的身份验证机制。通常,服务器会在此时关闭连接:HTTP/1.1 401 Unauthorized WWW-Authenticate: NTLM Connection: close
请注意,如果 NTLM 是第一个提供的机制,Internet Explorer 只会选择它;这与 RFC 2616 不一致,RFC 2616 规定客户端必须选择最受支持的身份验证方案。
客户端使用包含 Type 1 message 的
Authorization
header 重新提交请求范围。 Type 1 消息经过 Base-64 编码以进行传输。从这一点开始,连接保持打开状态;关闭连接需要重新验证后续请求。这意味着服务器和客户端必须通过 HTTP 1.0 样式的“Keep-Alive” header 或 HTTP 1.1(其中默认使用持久连接)支持持久连接。相关请求头显示如下:GET /index.html HTTP/1.1 Authorization: NTLM TlRMTVNTUAABAAAABzIAAAYABgArAAAACwALACAAAABXT1JLU1RBVElPTkRPTUFJTg==
服务器以包含 Type 2 message 的
401
状态回复在WWW-Authenticate
header 中(同样,Base-64 编码)。如下所示。HTTP/1.1 401 Unauthorized WWW-Authenticate: NTLM TlRMTVNTUAACAAAADAAMADAAAAABAoEAASNFZ4mrze8AAAAAAAAAAGIAYgA8AAAARABPAE0AQQBJAE4AAgAMAEQATwBNAEEASQBOAAEADABTAEUAUgBWAEUAUgAEABQAZABvAG0AYQBpAG4ALgBjAG8AbQADACIAcwBlAHIAdgBlAHIALgBkAG8AbQBhAGkAbgAuAGMAbwBtAAAAAAA=
客户端通过使用包含 Base-64 编码的 Type 3 message 的
Authorization
header 重新提交请求来响应 Type 2 消息:GET /index.html HTTP/1.1 Authorization: NTLM TlRMTVNTUAADAAAAGAAYAGoAAAAYABgAggAAAAwADABAAAAACAAIAEwAAAAWABYAVAAAAAAAAACaAAAAAQIAAEQATwBNAEEASQBOAHUAcwBlAHIAVwBPAFIASwBTAFQAQQBUAEkATwBOAMM3zVy9RPyXgqZnr21CfG3mfCDC0+d8ViWpjBwx6BhHRmspst9GgPOZWPuMITqcxg==
最后,服务器验证客户端的 Type 3 消息中的响应并允许访问资源。
HTTP/1.1 200 OK
获取用户的用户名应该很容易——它在 Type 3 消息中以纯文本形式发送。实际上验证他们是否提供了正确的密码完全是另一回事。实现所有这些留给读者作为练习。
关于linux - 没有 .NET 的 Windows 身份验证 header 。可能的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5303928/