我问这个问题是在我提出的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进行身份验证?
我可以看到浏览器制作的步骤......
https://my.crm.endpoint
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
https://my.crm.endpoint
。显示另一个302,然后最后一个GET到实际的default.aspx
页面。注意:经过身份验证后,我可以看到三个已设置的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
参数通知浏览器弹出登录框,这是否使得无法以编程方式实现此操作,而无需额外的用户交互?
这是一个重定向到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/
基于我的以下理解:
理想的解决方案是在这里应用S2S(服务器到服务器)场景,其中涉及CRM中的application user,而后者又用于使用OAuth客户端凭证流(客户端ID +机密)调用CRM API。问题是,据我所知,目前应用程序用户概念仅在CRM在线支持,而不是在本地。
那么您可以尝试以下3个选项之一: