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