使用来自Web App(Express.js)的NTLM身份验证使用内部部署(IFD)CRM进行身份验证

时间:2018-04-20 13:47:00

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

我在previous question后面提出这个问题,因为问题的范围有所改变,但可能值得先阅读背景信息。

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

在我的网络浏览器中,如果我访问我们的内部部署CRM终端:https://my.crm.endpoint,系统会提示我输入用户名和密码。

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

示例 https://my.crm.endpoint/api/data/v8.2/contacts?$选择=全名,使用ContactID

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

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

注意:我已阅读this from Microsoft来描述机制,但没有给出任何具体的例子。我甚至不知道应该使用什么样的哈希算法,或者设置哪些标题等等。

问题任何人都可以提供任何详细信息,说明我如何使用来自Web应用程序的NTLM(在我的情况下使用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。
  7. 注意:经过身份验证后,我可以看到三个已设置的Cookie,以及在查询上述api示例时发送的Cookie。这些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参数通知浏览器弹出登录框,这是否会导致无法以编程方式实现此操作,而无需额外的用户交互?

2 个答案:

答案 0 :(得分:1)

这是一个重定向到ADFS服务器以进行基于声明的身份验证。该页面或下一个重定向将要求您使用集成的证书,表单或窗口进行身份验证(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/

答案 1 :(得分:1)

基于我的以下理解:

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

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

那么你可以尝试以下三个选项之一:

  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。那么你必须使用授权代码授权流程,描述here。首先,您需要register an ADFS application,然后再次,您将需要进行多次HTTPS调用(其中一个将调用ADFS IWA身份验证端点)以最终获得可用于调用的令牌CRM端点。