ADAL Node.js 用户名密码身份验证

3
我正在使用adal node js库1.22,尝试使用用户名和密码对用户进行身份验证。 我收到“无法获取本地颁发者证书”的错误。 用户是联合的,错误发生在领域发现过程中。
 var context = new AuthenticationContext(authorityUrl);

context.acquireTokenWithUsernamePassword(resource, sampleParameters.username, sampleParameters.password, sampleParameters.clientId, function(err, tokenResponse) {
  if (err) {
    console.log('well that didn\'t work: ' + err.stack);
  } else {
    console.log(tokenResponse);
  }
});

错误堆栈:
Stack:
Error: unable to get local issuer certificate
    at Error (native)
    at TLSSocket.<anonymous> (_tls_wrap.js:1092:38)
    at emitNone (events.js:86:13)
    at TLSSocket.emit (events.js:185:7)
    at TLSSocket._finishInit (_tls_wrap.js:610:8)
    at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:440:38)
{ Error: unable to get local issuer certificate
    at Error (native)
    at TLSSocket.<anonymous> (_tls_wrap.js:1092:38)
    at emitNone (events.js:86:13)
    at TLSSocket.emit (events.js:185:7)
    at TLSSocket._finishInit (_tls_wrap.js:610:8)
    at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:440:38) code: 'UNABLE_TO_GET_ISSUER_CERT_LOCALLY' }
Wed, 14 Jun 2017 08:44:17 GMT:079c7b70-6ae1-461c-b433-cc3fe0c22783 - TokenRequest: VERBOSE: getTokenFunc returned with err
well that didn't work: Error: unable to get local issuer certificate
    at Error (native)
    at TLSSocket.<anonymous> (_tls_wrap.js:1092:38)
    at emitNone (events.js:86:13)
    at TLSSocket.emit (events.js:185:7)
    at TLSSocket._finishInit (_tls_wrap.js:610:8)
    at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:440:38)

请问我缺少哪个证书以及在哪里可以找到它?编辑后,通过查看代码,我发现注释掉代码中的全局代理部分解决了这个问题,并且该库能够执行一些步骤,但是在返回来自ADFS的令牌响应时出现了问题。日志如下:
    Wed, 14 Jun 2017 10:39:39 GMT:425e3117-a495-4f8e-8a12-e7e64dd0e37b - OAuth2Client: INFO: Get TokenServer returned this correlationId: 425e3117-a495-4f8e-8a12-e7e64dd0e37b
Wed, 14 Jun 2017 10:39:39 GMT:425e3117-a495-4f8e-8a12-e7e64dd0e37b - OAuth2Client: ERROR: Get Token request returned http error: 401 and server response: {"error":"invalid_client","error_description":"AADSTS70002: The request body must contain the following parameter: 'client_secret or client_assertion'.\r\nTrace ID: aadf1560-18ec-46f9-83b6-5932c2131200\r\nCorrelation ID: 425e3117-a495-4f8e-8a12-e7e64dd0e37b\r\nTimestamp: 2017-06-14 10:39:41Z","error_codes":[70002],"timestamp":"2017-06-14 10:39:41Z","trace_id":"aadf1560-18ec-46f9-83b6-5932c2131200","correlation_id":"425e3117-a495-4f8e-8a12-e7e64dd0e37b"}

有没有我忘记的配置?
if (!parametersFile) {
  sampleParameters = {
    tenant : 'tenant.onmicrosoft.com',
    authorityHostUrl : 'https://login.microsoftonline.com',
    clientId : 'aa461028-1fgf-46e5-ab9b-5adca324febc',
    username : 'user@domain.net',
    password : 'lamepassword'
  };
}

var authorityUrl = sampleParameters.authorityHostUrl + '/' + sampleParameters.tenant;

var resource = '00000002-0000-0000-c000-000000000000';
1个回答

2
资源所有者流程被强烈不建议使用,在某些情况下,例如联合用户或需要多因素认证的用户,此流程将无法正常工作。该流程是指您的应用程序直接处理用户的用户名和密码,并将其发送到身份提供者的请求中。如果身份验证需要任何额外的交互,如需要第二个因素或处理联合,则此方法将无法正常工作。出于这些原因和简单的安全原则(消除应用程序处理用户名和密码的需要),最好避免使用此流程。
由于您正在处理联合用户,资源所有者流程对您无效,留下了两种首选的替代方案:
- 如果要作为用户进行身份验证,请使用授权代码流 - 如果要作为应用程序进行身份验证,请使用客户端凭据流
请参阅“Azure AD身份验证方案”文档中的“从Web应用程序到Web API”的场景,了解有关在这两个选项之间进行选择的更多信息。

我在 ADAL 示例中没有看到任何地方使用“授权码流”发送用户名和密码。 - Spreadzz
你的问题不是很清楚。你指的是哪个 ADAL 示例?演示授权码流程的示例不处理用户名和密码。除非你在处理展示资源持有者流程的示例,否则你不会看到应用程序处理用户名和密码。 - Saca
资源所有者流程对联合用户仍然不支持吗?我现在已经尝试过了,幸运的是它似乎可以工作。至少详细日志显示“AccountType: federated”... - Marki555

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接