node.js - 使用 Web 应用程序 (Express.js) 中的 NTLM 身份验证对本地 (IFD) CRM 进行身份验证

标签 node.js authentication dynamics-crm adfs ntlm

我在 previous question 的背面问这个问题我提出这个问题的范围已经有所改变,但这可能值得首先阅读以获取背景信息。

我正在尝试使用 Node 支持的 Express 应用程序中的一组管理凭据以编程方式从 Dynamics CRM 实例中获取数据。此 Express 应用程序托管在托管 CRM 的网络外部的单独服务器上。然后,该应用程序将请求、处理 CRM 数据并将其返回给任何具有访问权限(由应用程序内的角色/权限控制)的登录用户,这意味着最终用户只需登录 Express 应用程序。

如果我通过网络浏览器访问我们的本地 CRM 端点:https://my.crm.endpoint,系统会提示我输入用户名和密码。

如果我提供正确的凭据,我就会通过身份验证并拥有对 CRM 的完全访问权限,从而允许我查询 API。

示例 https://my.crm.endpoint/api/data/v8.2/contacts ?$select=全名,联系人ID

这会返回一个可爱的 JSON 对象,其中包含我想要的所有数据:)

现在!在幕后,我可以看到它使用 NTLM 进行身份验证,对此我知之甚少:/阅读了一些内容并观看了一些 YouTube 视频后,我对质询/响应机制有了基本了解,但我仍然不确定如何继续。

注意:我已阅读 this from Microsoft它描述了机制,但没有给出任何具体示例。我什至不知道应该使用什么哈希算法,或者设置什么 header 等。

问题任何人都可以提供有关如何使用 NTLM 从 Web 应用程序(在我的例子中为 Express)通过我们的 CRM 进行身份验证的任何详细信息吗?

我可以看到浏览器制作的步骤...

  1. 访问https://my.crm.endpoint
  2. 302 重定向至:https://fs.our.domain/adfs/ls/?wa=wsignin1.0&wtrealm=https%3a%2f%2fmy.crm.endpoint%2f&wctx=rm%3d1%26id%3dfaf0791c-6a3a-4c4e-9e69-9dfa8fd4c2e8%26ru%3d% 252fdefault.aspx&wct=2018-04-20T10%3a12%3a37Z&wauth=urn%3afederation%3aauthentication%3awindows
  3. 提示输入用户凭据
  4. ** 输入凭据**
  5. 这里发生了一大堆事情,我有点迷失,但看起来好像收到了几个 401,然后向 https://my.crm.endpoint 发送了一个 POST。显示另一个 302,然后最后 GET 到实际的 default.aspx 页面。
  6. 然后我就可以访问 CRM。

注意:经过身份验证后,我可以看到已设置的三个 cookie,这些 cookie 在查询上面的 api 示例时发送。这些 cookie 是 MSISAuth、MSISAuth1 和 ReClientId。

如果我缺少任何重要信息,请告诉我,我会尽力提供!

更新

我刚刚安装了 httpntlm 模块并尝试使用此进行身份验证...

let httpntlm = require('httpntlm');
httpntlm.get({
    url: 'https://my.crm.endpoint',
    username: '<my.email@address.com>',
    password: '<mypassword>',
    workstation: '',  // unsure what to put here if anything?
    domain: ''        // unsure what to put here if anything?
}, function (err, res){
    if(err) return err;

    console.log(res.headers);
    console.log(res.body);
});

我得到的回复是这样的......

{ location: 'https://fs.our.domain/adfs/ls/?wa=wsignin1.0&wtrealm=https%3a%2f%2fmy.crm.endpoint%2f&wctx=rm%3d1%26id%3d93a4c6fd-5b17-4a2b-965f-07af5e96b08f%26ru%3d%252fdefault.aspx&wct=2018-04-20T14%3a08%3a00Z&wauth=urn%3afederation%3aauthentication%3awindows',
  server: 'Microsoft-IIS/8.5',
  req_id: '298acefc-53aa-46fa-96c4-e5d8762b1fd2',
  'x-powered-by': 'ASP.NET',
  date: 'Fri, 20 Apr 2018 14:08:00 GMT',
  connection: 'close',
  'content-length': '397' }
<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="https://fs.our.domain/adfs/ls/?wa=wsignin1.0&wtrealm=https%3a%2f%2fmy.crm.endpoint%2f&wctx=rm%3d1%26id%3d93a4c6fd-5b17-4a2b-965f-07af5e96b08f%26ru%3d%252fdefault.aspx&wct=2018-04-20T14%3a08%3a00Z&wauth=urn%3afederation%3aauthentication%3awindows">here</a>.</h2>
</body></html>

有人能够阐明我实际上需要做什么吗?! :-/

更新2

根据 @markgamache 评论,并阅读了建议的文档,我们确实正在使用 WS-Fed!由于 Wa=signin1.0 参数通知浏览器弹出登录框,这是否导致无法通过编程方式实现此目的,而无需额外的用户交互?

最佳答案

基于我的以下理解:

  • 您正在本地使用具有声明身份验证 (ADFS) 功能的 CRM。这意味着当用户访问 CRM 时,用户会被重定向到 ADFS 进行身份验证(如果用户位于内部网络,默认情况下 ADFS 使用集成 Windows 身份验证),然后用户会被重定向回 CRM。
  • 您必须从外部 (node.js) 应用程序调用 CRM 端点。该调用不是“客户端”(即通过浏览器/javascript)而是“服务器端”(即来自托管应用程序的 Web 服务器)

理想的解决方案是在这里应用 S2S(服务器到服务器)场景,其中涉及 application user在 CRM 中,它又用于使用 OAuth 客户端凭据流(客户端 ID + key )调用 CRM API。问题是,据我所知,目前应用程序用户概念仅在在线 CRM 中支持,而不是本地 CRM。

那么您可以尝试以下 3 个选项之一:

  1. 尽管您在 CRM 中使用声明身份验证,但您仍然可以使用集成 Windows 身份验证 (IWA)。如何?如果您检查 CRM IIS 站点,则必须具有 HTTPS 绑定(bind)。如果添加 HTTP 绑定(bind)(即端口 80 无主机头),则可以访问 http://CRM_Server_Name/api/data/v8.2/contacts使用 IWA。因此,在这种情况下,您已经尝试过的 httpntlm 模块可以工作。请注意,CRM 支持一个 HTTPS IIS 绑定(bind)和一个 HTTP IIS 绑定(bind) - 因此请确保不要为每种类型添加多个绑定(bind)。
  2. 模仿(当然是以编程方式)您在浏览器中观察到的身份验证流程。这是什么意思?生成 IWA 身份验证请求至 https://fs.our.domain/adfs/ls/?wa=wsignin1.0&wtrealm=https%3a%2f%2fmy.crm.endpoint%2f&wauth=urn%3afederation%3aauthentication%3awindows 。 ADFS 将对您进行身份验证并为您提供一些 cookie。您将需要存储这些 cookie 才能向 https://my.crm.endpoint/api/data/v8.2/contacts 发出后续请求。这不是一个很好的解决方案,但应该可行。
  3. 使用 OAuth。问题是,正如我在开头所描述的,据我所知,此场景的理想 OAuth 流程(客户端凭据)不适用于 CRM on Prem。因此,您必须使用授权代码授予流程,如here所述。 。首先您需要register an ADFS application然后,您将需要进行多次 HTTPS 调用(其中之一是对 ADFS IWA 身份验证端点的调用)才能最终获得可用于调用 CRM 端点的 token 。

关于node.js - 使用 Web 应用程序 (Express.js) 中的 NTLM 身份验证对本地 (IFD) CRM 进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49943116/

相关文章:

javascript - 在 "Unique Morse Code Words"问题中,我在使用 JavaScript 时遇到问题

node.js - Nodejs 和 Express 从 sessionStore 中删除 session

java - Spring Security Cookie + JWT 认证

dynamics-crm-2011 - 通过 CRM 2016 中的 api 调用获取下拉字段的文本

c# - 如何以通过 AAD 进行身份验证的 ASP.NET MVC 站点中的登录用户身份查询 Dynamics 365 CRM?

javascript - 通过 URL 将大型 Xml 文件转换为 JSON

node.js - 与 postgres 数据库的连接失败

google-app-engine - 如何将自定义信息从 App Engine 身份验证器传递到端点?

c# - 创建单个 CRM 插件 DLL 以存储在 CRM 数据库中

javascript - 有没有办法通过一次调用来更新或删除多个模型实例?