Azure ad b2c B2C:Angular+WebAPI注册流导致服务器端没有电子邮件声明-SignIn工作正常

Azure ad b2c B2C:Angular+WebAPI注册流导致服务器端没有电子邮件声明-SignIn工作正常,azure-ad-b2c,Azure Ad B2c,全部, 我正在使用带有自定义IEF策略的Azure AD B2C。SignIn和SignUp策略都返回相同的声明 我的保单名称为B2C_1A_sign,B2C_1A_SignUp 如果我在做注册流,那么最终出现在WebAPI端的context.User没有电子邮件声明。如果我在做登录流,它有电子邮件声明 我已经查看了注册后客户端SessionStorage中的所有令牌,每个JWT令牌中都有电子邮件声明 注册后客户端JWT令牌的内容如下: { "exp": 1565283437,

全部,

我正在使用带有自定义IEF策略的Azure AD B2C。SignIn和SignUp策略都返回相同的声明

我的保单名称为B2C_1A_sign,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
           };
       });

有什么建议吗?

这是因为在登录期间,声明名称是登录技术配置文件输出声明中的signInName,而不是像注册技术配置文件那样的电子邮件。因此,电子邮件被捕获,只是保存在不同的索赔名称中

您可以将其放入relyingParty outputclaims部分,以便在JWT中发出时将signInName映射到不同的索赔名称电子邮件: