2

我正在尝试使用 Passport.js 和带有 OpenID Connect 策略的 Azure Active Directory B2C 为我的 Node.js Web 应用程序实现面向客户的身份验证。

我已按照官方 GitHub 页面上的 README 说明,并研究了官方示例应用程序的源代码,但它们似乎不完整和/或过时,正如在线各种线程所同意的那样。

在拼凑来自网络的各种提示后,我跨越了许多桥梁,但陷入僵局并出现以下错误:

cannot get AAD Federation metadata from endpoint you specified.

AAD 身份验证需要大量配置,所以我会注意一些重要的值:

  • policyName: 这就是b2c_1_signin,就像我在 Azure 门户中配置的一样。
  • identityMetadata:我正在使用特定于租户的 v2.0 端点。我添加?p=b2c_1_signin了注入策略名称。
  • responseTypeid_token
  • redirectUrl:这是我在 Azure 中配置的本地主机和端口。allowHttpForRedirectUrl设置为true。(这适用于非生产环境。)
  • isB2Ctrue
4

1 回答 1

7

对于 B2C,您需要设置validateIssuer: false. 对于非通用端点,我们使用从 AAD 返回的元数据中的颁发者,对于 B2C,passport.authenticate 无法issuer从元数据中获取值。对于 B2C,护照使用 TenantId 来处理验证,因此必须提供,这将是identityMetadata.

此外,identityMetadata应该有这种格式:

identityMetadata: "https://" + b2cDomainHost + "/" + tenantIdGuid + "/" + policyName + "/v2.0/.well-known/openid-configuration/"

我认为没有设置护照来处理元数据 url 的这种格式->?p=b2c_1_signin

您可以尝试这个 node.js 示例,并使用您自己的值,这将调用到 passport.js 库。

例子:

var clientID = "93733604-cc77-4a3c-a604-87084dd55348";
var b2cDomainHost = "fabrikamb2c.b2clogin.com";
var tenantIdGuid = "775527ff-9a37-4307-8b3d-cc311f58d925";
var policyName = "B2C_1_SUSI";
var options = {
    identityMetadata: "https://" + b2cDomainHost + "/" + tenantIdGuid + "/" + policyName + "/v2.0/.well-known/openid-configuration/",

    clientID: clientID,
    policyName: policyName,
    isB2C: true,
    validateIssuer: false,
    loggingLevel: 'info',
    loggingNoPII: false,
    passReqToCallback: false
};
于 2020-02-05T17:24:02.650 回答