linux - 没有 .NET 的 Windows 身份验证 header 。可能的?

标签 linux node.js windows-authentication

我想知道是否有人知道无需托管在 ASP 站点上即可使用 Windows 身份验证的方法。这是一个可以访问 LDAP 的内部网,所以我想知道是否有办法强制客户端向我提供数据,就好像它来自 ASP 站点一样。我只需要登录域和用户名,就可以从那里运行。在 Ubuntu 上使用 Node.js。任何人都有这方面的经验吗?

最佳答案

更新:现在有a module that implements Windows-integrated authentication .


在您的 401 响应中,您需要提供一个值为 NTLMWWW-Authenticate header ,它通知浏览器他们需要发送 Windows 凭据。

response.writeHead(401, {
    'WWW-Authenticate': 'NTLM',
});

然后您可以享受实现 NTLM 身份验证的乐趣。引自 this document about the NTLM authentication protocol :


  1. 客户端向服务器请求 protected 资源:

    GET /index.html HTTP/1.1
    
  2. 服务器以 401 状态响应,表示客户端必须进行身份验证。 NTLM 通过 WWW-Authenticate header 呈现为受支持的身份验证机制。通常,服务器会在此时关闭连接:

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

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

  3. 客户端使用包含 Type 1 messageAuthorization header 重新提交请求范围。 Type 1 消息经过 Base-64 编码以进行传输。从这一点开始,连接保持打开状态;关闭连接需要重新验证后续请求。这意味着服务器和客户端必须通过 HTTP 1.0 样式的“Keep-Alive” header 或 HTTP 1.1(其中默认使用持久连接)支持持久连接。相关请求头显示如下:

    GET /index.html HTTP/1.1
    Authorization: NTLM TlRMTVNTUAABAAAABzIAAAYABgArAAAACwALACAAAABXT1JLU1RBVElPTkRPTUFJTg==
    
  4. 服务器以包含 Type 2 message401 状态回复在 WWW-Authenticate header 中(同样,Base-64 编码)。如下所示。

    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: NTLM TlRMTVNTUAACAAAADAAMADAAAAABAoEAASNFZ4mrze8AAAAAAAAAAGIAYgA8AAAARABPAE0AQQBJAE4AAgAMAEQATwBNAEEASQBOAAEADABTAEUAUgBWAEUAUgAEABQAZABvAG0AYQBpAG4ALgBjAG8AbQADACIAcwBlAHIAdgBlAHIALgBkAG8AbQBhAGkAbgAuAGMAbwBtAAAAAAA=
    
  5. 客户端通过使用包含 Base-64 编码的 Type 3 messageAuthorization header 重新提交请求来响应 Type 2 消息:

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

     HTTP/1.1 200 OK
    

获取用户的用户名应该很容易——它在 Type 3 消息中以纯文本形式发送。实际上验证他们是否提供了正确的密码完全是另一回事。实现所有这些留给读者作为练习。

关于linux - 没有 .NET 的 Windows 身份验证 header 。可能的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5303928/

相关文章:

asp.net - 从asp.net获取AD用户objectGuid的身份验证

linux - 使用 pipe 而不是 pipe2 时,在 fork 之后阻止在管道上读取

linux - EPOLLONESHOT 是否阻止在对 epoll_wait() 的单个调用中返回单个描述符上的多个事件?

asp.net-core-mvc - 是否可以在windows身份验证中允许匿名访问某些页面?

node.js - node.js 的 Openshift 端口

node.js - 使用 npm publish 时动态添加要忽略的文件夹

java - 登录时执行java程序

ruby-on-rails - 为 Ruby 2.0 配置 Rails

regex - Grep 某些字符

javascript - Node.js 同步加载 JS 变量的最佳方式