azure-ad-b2c - B2C:Angular + Web API 注册流程导致服务器端没有 EMAIL 声明 - 登录工作正常
问题描述
全部,
我正在使用带有自定义 IEF 策略的 Azure AD B2C。SignIn 和 SignUp 策略都返回相同的声明。
我的策略名称命名为 B2C_1A_SignIn、B2C_1A_SignUp
如果我正在执行注册流程,则最终在 WebAPI 端的 context.User 没有电子邮件声明。如果我正在执行登录流程,则它具有电子邮件声明。
注册后,我查看了客户端 SessionStorage 中的所有令牌,并且每个 JWT 令牌中都有电子邮件声明。
注册后客户端的 JWT 令牌内容如下图所示:
{
"exp": 1565283437,
"nbf": 1565279837,
"ver": "1.0",
"iss": "https://**redacted**/654015a2-3419-4a3b-ac9e-84f39d106b2d/v2.0/",
"sub": "d0d27e7a-1e82-4d77-b80d-e5462bc7ee93",
"aud": "10896880-da14-4057-827b-886cfb847581",
"acr": "b2c_1a_signup",
"nonce": "08f7ed0c-8106-48ad-99f0-5891f2c22a2f",
"iat": 1565279837,
"auth_time": 1565279837,
"given_name": "Michael",
"family_name": "Gerety",
"email": "michael@**redacted**",
"tid": "654015a2-3419-4a3b-ac9e-84f39d106b2d"
}
以下是登录流程后的 JWT ID 令牌实例:
{
"exp": 1565284448,
"nbf": 1565280848,
"ver": "1.0",
"iss": "https://*redacted*.b2clogin.com/654015a2-3419-4a3b-ac9e-84f39d106b2d/v2.0/",
"sub": "d0d27e7a-1e82-4d77-b80d-e5462bc7ee93",
"aud": "10896880-da14-4057-827b-886cfb847581",
"acr": "b2c_1a_signin",
"nonce": "1fd749b2-bdbd-4491-a98e-b42dc5949e40",
"iat": 1565280848,
"auth_time": 1565280848,
"signInName": "michael@*redacted*",
"given_name": "Michael",
"family_name": "Gerety",
"tid": "654015a2-3419-4a3b-ac9e-84f39d106b2d"
}
有趣的是,SignInName 似乎出现在登录流程中。该声明在注册流程中不存在。
在服务器端,它的配置如下:
.AddJwtBearer(jwtOptions =>
{
jwtOptions.Authority = $"https://**redacted**.b2clogin.com/{Configuration["B2CTenant"]}/{Configuration["B2CSignInPolicyTest"]}/v2.0";
jwtOptions.Audience = Configuration["B2CBuilderPortalAPIClientId"];
jwtOptions.Events = new JwtBearerEvents
{
OnMessageReceived = ctx =>
{
if (ctx.Request.Method.Equals("GET") && ctx.Request.Query.ContainsKey("accessToken"))
ctx.Token = ctx.Request.Query["accessToken"];
return Task.CompletedTask;
},
OnAuthenticationFailed = AuthenticationFailed
};
});
有什么建议么?
解决方案
这是因为在登录期间,声明名称是登录技术配置文件的 OutputClaims 中的 signInName,而不是像注册技术配置文件那样的电子邮件。因此,电子邮件被捕获,只是以不同的声明名称保存。
当在 JWT 中发布时,您可以将其放在依赖方输出声明部分中,以将 signInName 映射到不同的声明名称(电子邮件):
<OutputClaim ClaimTypeReferenceId="signInName" PartnerClaimType="email"/>
推荐阅读
- cmake - 将 FetchContent_Declare 与共享库一起使用时出现问题
- scala - Scala:如何按键分组并在 scala 中汇总值并以预期的返回类型返回列表
- python - 如何滚动锁定 Django HTML 网页
- flutter - 颤动的未来
_loadAsync 错误 - javascript - 有人可以根据 ecma262 向我解释 FunctionDeclarationInstantiation 的作用吗?
- python - 以下用于最小化函数的代码返回 RuntimeWarning。为什么?
- angular - 为什么不显示数据表中扩展行中的 ng-charts?
- user-defined-functions - 如何在 Presto/Trino 自定义 UDF 结束时运行清理代码?
- c# - REFIT:如何在编写查询时忽略类属性
- flutter - 如何在flutter中从firebase获取当前用户的uid?