我正在尝试使用带有OpenID Connect策略的Passport.js和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

最佳答案

对于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的这种格式

您可以尝试this node.js sample,并使用您自己的值,这些值将被调用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
};

关于node.js - 带有Passport.js错误的Azure Active Directory B2C错误“无法获取广告联合元数据”错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60070024/

10-16 22:58