如何以非交互方式从 node.js 服务器端使用 azure AD 身份验证

How to use azure AD authentication from node.js server side non interactively

我已经配置了 azure AD 服务和其中的一个用户,并使用 react-adal 来获取令牌,这有效 fine.But 现在我需要更改此流程,而是拥有自己的登录表单并发送node.js express 服务器的凭据并从 azure ad 验证这些凭据,而不会从 azure 弹出登录窗口并将返回的令牌存储在护照中 session.I 已尝试使用 node-adal 但不确定如何实现,可以这能完成吗?有没有 this.Thanks

的例子

有一个方法,但你不应该使用它。 使用联合身份验证时,您不应处理密码。

一种可行的方法是遗留迁移路径,称为 ROPC 流。 但是,其中 none 个将起作用:

  • 拥有 MFA 的用户
  • 从本地 AD 同步的用户
  • 密码已过期的用户

如果您想以用户身份在后台执行某些操作,请让他们登录并安全地存储他们的刷新令牌。 您需要将前端访问令牌交换为后端访问令牌 + 刷新令牌。 然后您可以随时使用刷新令牌为用户获取新令牌。

或者,您可以要求应用程序获得 API 的权限,并使用来自您的 API 的客户端凭据访问它们(客户端 ID + secret/certificate)。

同意@juunas的观点,这里提供非交互方式(login with username and password)供大家参考。此示例用于管理 MicrosoftGraph 资源。

var msRestAzure = require('ms-rest-azure');
 var graphRbacManagementClient = require('azure-graph');
 var tenantId='abcd-efgh-ijk-lmno-12345';
 // Enter your tenant ID here which can be found from your Azure AD URL
 // Eg. https://manage.windowsazure.com/example.com#Workspaces/ActiveDirectoryExtension/Directory/<TenantId>/users

 msRestAzure.loginWithUsernamePassword('username@contosocorp.onmicrosoft.com', 'your-password', { tokenAudience: 'graph', domain: tenantId }, function (err, credentials, subscriptions) {
  if (err) console.log(err);
  var client = new graphRbacManagementClient(credentials, tenantId);
  var userParams = {
    accountEnabled: true,
    userPrincipalName: 'OfficialStark@<yourdomain.com>', //please add your domain over here
    displayName: 'Jon Snow',
    mailNickname: 'OfficialStark',
    passwordProfile: {
      password: 'WinterisComing!',
      forceChangePasswordNextLogin: false
    }
  };
  client.users.create(userParams, function (err, user, request, response) {
    if (err) return console.log(err);
    console.log(user);
    var userObjectId = user.objectId;
    client.users.list(function (err, result, request, response) {
      if (err) return console.log(err);
      console.log(result);
      client.users.deleteMethod(userObjectId, function (err, result, request, response) {
        if (err) return console.log(err);
        console.log(result);
      });
    });
  });
 });