【发布时间】: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 进行身份验证?
我可以看到浏览器制作的步骤...
- 访问
https://my.crm.endpoint - 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 - 提示输入用户凭据
- ** 输入凭据**
- 这里发生了一大堆事情,我有点迷茫,但看起来它得到了几个 401,然后向
https://my.crm.endpoint发送了一个 POST。显示另一个 302,最后是对实际default.aspx页面的 GET。 - 然后我就可以访问 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