Azure B2C - 无法从策略中的 JWT 客户端断言令牌读取“日期”声明

Posted

技术标签:

【中文标题】Azure B2C - 无法从策略中的 JWT 客户端断言令牌读取“日期”声明【英文标题】:Azure B2C - Not able to read "Date" Claim from JWT client assertion token in policy 【发布时间】:2019-10-27 22:16:45 【问题描述】:

我无法从 JWT 客户端断言令牌中读取日期声明,然后通过转换方法“ConvertDateToDateTimeClaim”转换为“日期时间”声明。我在索赔中尝试了以下日期格式,但没有一个有效。当我在 B2C 策略中设置日期声明的默认值时,它可以例外地工作。

JWT 令牌: "createdDate1": "2019-05-26", "createdDate2": "2019-05-26T00:00:00", "createdDate3": "2019-05-26T00:00:00Z", "verifiedEmail": "xxxxxxxxxxxxxxx", “nbf”:1560005928, “exp”:1560006228, "iss": "xxxxxxxxxxxxxxxxxxxx", “审计”:“xxxxxxxxxxxxxxxxxxxxx”

错误:ID 为“createdDate”的声明的数据类型“字符串”与策略中指定的 ID 为“createdDate”的 ClaimType 的数据类型“日期”不匹配。

B2C Policy

需要帮助。

【问题讨论】:

嗨@Jeeva。如果日期声明设置为 NumericDate,即从 1970-01-01T00:00:00Z UTC 到创建时间 UTC 的秒数,如 exp 声明? @ChrisPadgett 嗨,我尝试从 idTokenHint 参数中的 JWT 读取声明。也没有工作。还没有找到正确读取日期时间的方法。 【参考方案1】:

尝试从 id_token_hint 参数中的 JWT 读取 dateTime 声明时出现错误。这周修好了。我可以想象它与日期声明相同。

我创建了一个具有以下声明的 JWT:

DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
new System.Security.Claims.Claim("LinkExpirationDateTime", ((long)(DateTime.UtcNow.AddMinutes(_appSettings.LinkExpiresAfterMinutes) - unixEpoch).TotalSeconds).ToString(), System.Security.Claims.ClaimValueTypes.DateTime, issuer)

您可以像https://github.com/azure-ad-b2c/samples/ 上的一些示例中所示那样阅读它(例如“电子邮件传递的帐户兑换链接”)。 ClaimType 是:

<ClaimType Id="LinkExpirationDateTime">
    <DisplayName>LinkExpirationDateTime</DisplayName>
    <DataType>dateTime</DataType>
</ClaimType>

【讨论】:

以上是关于Azure B2C - 无法从策略中的 JWT 客户端断言令牌读取“日期”声明的主要内容,如果未能解决你的问题,请参考以下文章

仅验证从 Azure B2C AD 生成的 JWT 令牌的签名 [重复]

Azure AD B2C - 自定义策略中的“电子邮件”声明

Azure AD B2C 使用 PHP 验证 JWT

无法登录到新的 Azure B2C 目录

如何在 Web API 中验证 Azure B2C JWT 令牌?

Azure B2C:如何在 JWT 令牌中获得“组”声明