首页 > 解决方案 > 如何使用 ADAL 和 MFA 登录 AAD

问题描述

我正在尝试创建一个 nodejs api,它使用 ADAL 插件(https://github.com/AzureAD/azure-activedirectory-library-for-nodejs)连接到 Azure Active Directory。

对于普通用户来说一切正常,但如果用户启用了 MFA(多因素身份验证),它会失败并抛出错误消息。我发现这与 ADAL-MFA 有关:https ://github.com/AzureAD/azure-activedirectory-library-for-nodejs/issues/151但我从他的回答中不清楚是否可能,以及如何实施 MFA。

该插件的文档非常差,我不清楚如何从中检索错误消息和变量。据说错误变量是一个对象,但它是一个字符串。

这是我的端点代码,适用于普通用户:

      var adal = require('adal-node');
      var AuthenticationContext = adal.AuthenticationContext;
      var authorityUrl = parameters.authorityHostUrl + '/' + parameters.tenant;
      var resource = '00000003-0000-0000-c000-000000000000';
      var context = new AuthenticationContext(authorityUrl, true, new adal.MemoryCache);

context.acquireTokenWithUsernamePassword(resource, parameters.username, parameters.password, parameters.clientId, function(err, token) {

    if(err){

      mysql_connection.end();
      return callback(null, {
          status: false,
          error: err.stack,
          log: logging.message,
          test: 1
      });
    }
)};

所以基本上我需要使用用户凭据(电子邮件和密码)连接到 AAD api,但服务器到服务器(我的 nodeJS api 到 AAD api)。它需要与 MFA 一起工作。

(web app -> nodeJS API -> AAD API)

acquireTokenWithUsernamePassword完美地为此工作,但它不适用于 MFA,或者我不知道做出正确的调整以使其工作。

标签: node.jsazure-active-directoryadaladal.js

解决方案


您正在使用资源所有者密码凭据授予流程 (ROPC),并且遇到了我告诉人们不要使用它的确切场景之一。(除了测试自动化)

您不能对具有 MFA 的用户使用 ROPC。您也不能将它与与本地 AD 或 Microsoft 个人帐户联合的用户一起使用。或与密码已过期且需要重置的用户一起使用。

您需要切换您的 API 以使用代表授权流程(将您的 API 获得的访问令牌交换为新令牌,继续委派)或客户端凭证流程(仅使用应用凭证获取令牌,没有用户)来获取令牌语境)。

代流


推荐阅读