【问题标题】:Authenticating with on-premise (IFD) CRM using NTLM authentication from Web App (Express.js)使用来自 Web 应用 (Express.js) 的 NTLM 身份验证对本地 (IFD) CRM 进行身份验证
【发布时间】:2018-04-20 13:47:00
【问题描述】:

我是在我提出的 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=fullname,contactid

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

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

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

问题谁能提供任何详细信息,说明我如何使用来自 Web 应用程序(在我的情况下为 Express)的 NTLM 向我们的 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,最后是对实际 default.aspx 页面的 GET。
  6. 然后我就可以访问 CRM。

注意:一旦通过身份验证,我可以看到三个已设置的 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 参数通知浏览器弹出一个登录框,这是否使得在没有额外用户交互的情况下无法以编程方式实现这一目标?

【问题讨论】:

标签: node.js authentication dynamics-crm adfs ntlm


【解决方案1】:

基于我的以下理解:

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

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

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

  1. 尽管您在 CRM 中使用声明身份验证,但您仍然可以使用集成 Windows 身份验证 (IWA)。如何?如果您检查 CRM IIS 站点,则必须具有 HTTPS 绑定。如果添加 HTTP 绑定(即端口 80 没有主机头),则可以使用 IWA 访问http://CRM_Server_Name/api/data/v8.2/contacts。所以在这种情况下,您已经尝试过的 httpntlm 模块可以工作。请注意,CRM 支持一个 HTTPS IIS 绑定和一个 HTTP IIS 绑定 - 因此请确保不要为每种类型添加多个绑定。
  2. 模仿(当然以编程方式)您在浏览器中观察到的身份验证流程。这是什么意思?向https://fs.our.domain/adfs/ls/?wa=wsignin1.0&wtrealm=https%3a%2f%2fmy.crm.endpoint%2f&wauth=urn%3afederation%3aauthentication%3awindows 生成经过 IWA 身份验证的请求。 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 的令牌端点。

【讨论】:

    【解决方案2】:

    这是重定向到 ADFS 服务器以进行基于声明的身份验证。该页面或下一个重定向将要求您使用证书、表单或集成的 Windows(NTLM 或 Kerberos)进行身份验证。如果您通过了身份验证,您的浏览器将获得一个发送到https://my.crm.endpoint 的令牌。该 URL 表明索赔将通过 WS*。 https://blogs.technet.microsoft.com/askpfeplat/2014/11/02/adfs-deep-dive-comparing-ws-fed-saml-and-oauth/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      相关资源
      最近更新 更多