为什么在使用 azure b2c 进行 SSO 时,api 连接器不返回电子邮件?
Why is email not returned with api connector when SSO with azure b2c?
我有一个带有 API 连接器的用户流。我正在使用 "before sending the token" api 连接器检索用户在我的数据库中的角色,然后将其作为 extension_Role.
在令牌中发回
当我执行正常流程时一切正常,对我来说是:
- 注册
- 断开连接
- 登录
这很好用,因为在注册时我手动输入了电子邮件,在登录时我也手动输入了电子邮件。在这两种情况下,我的 C# 后端 api 连接器都收到了电子邮件声明。
当我访问另一个网站时,使用相同的用户流程,但激活了 SSO,这就变得棘手了。这意味着它不会触发我再次输入我的凭据,但它会尝试在后台登录。当它这样做时,我仍然调用了我的 C# 后端,但这次没有电子邮件。这是收到的 JSON:
{
"step":"PreTokenIssuance",
"client_id":"HIDDEN FOR SECURITY",
"ui_locales":"en-US",
"objectId":"HIDDEN FOR SECURITY",
"surname":"HIDDEN FOR SECURITY",
"displayName":"HIDDEN FOR SECURITY",
"givenName":"HIDDEN FOR SECURITY"
}
我想知道为什么我没有电子邮件。
我的用户流中有应用声明和用户声明:
如果这个问题没有真正的解决方案,一个方法是创建一个名为“AutomaticEmail”的新自定义字段,并在注册时用用户电子邮件填写该字段。这会起作用,但我认为这是一个愚蠢的解决方案,因为已经有一个用于此目的的现场电子邮件,如果用户出于任何原因更改电子邮件,将会出现很多问题。
• 这是因为当您登录另一个网站时,它是一个不受信任的域,即使通过 SSO 身份验证后后端 C# json 文件中的声明被隐藏,令牌中的声明输出收到的是加密的,而电子邮件声明属性被省略,而其他声明属性仍然存在于收到的令牌中,即使是 hidden/encrypted.
• 因此,电子邮件声明属性可能在 json 文件中返回 null,因为它在列中的值可能丢失或未知。因此,当元素为 null 时,要么省略关于电子邮件属性的键值对,要么 returns 对应于 Azure AD B2C 声明数据类型的值。因此,由于电子邮件声明属性是字符串类型,因此它 returns 空字符串为“”,就像在收到的身份验证令牌中看不到电子邮件属性一样。
• 此外,将以下声明添加到自定义策略输出声明中,以便您能够将电子邮件作为响应令牌中的一个属性获取,因为您的自定义策略可能允许您 signup/sign 通过多个属性声明类型,并且在使用电子邮件以外的其他声明类型时,您可能不会收到电子邮件声明。
<!-- This was already here -->
<OutputClaim ClaimTypeReferenceId="email" />
<!-- Added claim -->
<OutputClaim ClaimTypeReferenceId="signInNames.emailAddress"
PartnerClaimType="email" />
请在下面找到 link,其中解释了 API 连接器以扩展和自定义用户注册流程以及对返回的空值的处理:-
我有一个带有 API 连接器的用户流。我正在使用 "before sending the token" api 连接器检索用户在我的数据库中的角色,然后将其作为 extension_Role.
在令牌中发回当我执行正常流程时一切正常,对我来说是:
- 注册
- 断开连接
- 登录
这很好用,因为在注册时我手动输入了电子邮件,在登录时我也手动输入了电子邮件。在这两种情况下,我的 C# 后端 api 连接器都收到了电子邮件声明。
当我访问另一个网站时,使用相同的用户流程,但激活了 SSO,这就变得棘手了。这意味着它不会触发我再次输入我的凭据,但它会尝试在后台登录。当它这样做时,我仍然调用了我的 C# 后端,但这次没有电子邮件。这是收到的 JSON:
{
"step":"PreTokenIssuance",
"client_id":"HIDDEN FOR SECURITY",
"ui_locales":"en-US",
"objectId":"HIDDEN FOR SECURITY",
"surname":"HIDDEN FOR SECURITY",
"displayName":"HIDDEN FOR SECURITY",
"givenName":"HIDDEN FOR SECURITY"
}
我想知道为什么我没有电子邮件。
我的用户流中有应用声明和用户声明:
如果这个问题没有真正的解决方案,一个方法是创建一个名为“AutomaticEmail”的新自定义字段,并在注册时用用户电子邮件填写该字段。这会起作用,但我认为这是一个愚蠢的解决方案,因为已经有一个用于此目的的现场电子邮件,如果用户出于任何原因更改电子邮件,将会出现很多问题。
• 这是因为当您登录另一个网站时,它是一个不受信任的域,即使通过 SSO 身份验证后后端 C# json 文件中的声明被隐藏,令牌中的声明输出收到的是加密的,而电子邮件声明属性被省略,而其他声明属性仍然存在于收到的令牌中,即使是 hidden/encrypted.
• 因此,电子邮件声明属性可能在 json 文件中返回 null,因为它在列中的值可能丢失或未知。因此,当元素为 null 时,要么省略关于电子邮件属性的键值对,要么 returns 对应于 Azure AD B2C 声明数据类型的值。因此,由于电子邮件声明属性是字符串类型,因此它 returns 空字符串为“”,就像在收到的身份验证令牌中看不到电子邮件属性一样。
• 此外,将以下声明添加到自定义策略输出声明中,以便您能够将电子邮件作为响应令牌中的一个属性获取,因为您的自定义策略可能允许您 signup/sign 通过多个属性声明类型,并且在使用电子邮件以外的其他声明类型时,您可能不会收到电子邮件声明。
<!-- This was already here -->
<OutputClaim ClaimTypeReferenceId="email" />
<!-- Added claim -->
<OutputClaim ClaimTypeReferenceId="signInNames.emailAddress"
PartnerClaimType="email" />
请在下面找到 link,其中解释了 API 连接器以扩展和自定义用户注册流程以及对返回的空值的处理:-