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

问题描述 投票:0回答:2

我问这个问题是在我提出的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?$ select = fullname,contactid

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

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

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

问题任何人都可以提供任何类型的详细信息,说明如何使用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的然后一个POST是对https://my.crm.endpoint。显示另一个302,然后最后一个GET到实际的default.aspx页面。
  6. 然后我可以访问CRM。

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

如果我遗漏了任何重要信息,请告诉我,我会尽我所能!

UPDATE

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

let httpntlm = require('httpntlm');
httpntlm.get({
    url: 'https://my.crm.endpoint',
    username: '<[email protected]>',
    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
2个回答
1
投票

这是一个重定向到ADFS服务器进行基于声明的身份验证。该页面或下一个重定向将要求您使用集成的证书,表单或窗口进行身份验证(NTLM或Kerberos)。如果您通过auth,您的浏览器将获得一个令牌发送到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
投票

基于我的以下理解:

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

理想的解决方案是在这里应用S2S(服务器到服务器)场景,其中涉及CRM中的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。那么你必须使用授权代码授权流程,描述here。首先,您将需要register an ADFS application然后再次,您将需要进行多次HTTPS调用(其中一个将调用ADFS IWA身份验证端点)以最终获得可用于调用CRM端点的令牌。
© www.soinside.com 2019 - 2024. All rights reserved.