Asp.net core mvc 具有Azure应用注册的Azure AD v2在直接分配用户的ID令牌中缺少可选电子邮件声明

Asp.net core mvc 具有Azure应用注册的Azure AD v2在直接分配用户的ID令牌中缺少可选电子邮件声明,asp.net-core-mvc,azure-active-directory,microsoft-graph-api,openid-connect,Asp.net Core Mvc,Azure Active Directory,Microsoft Graph Api,Openid Connect,我正在使用Azure AD IAM将托管在Azure应用程序服务中的asp net核心MVC web应用程序从v1迁移到v2。当用户登录时,我在包含用户电子邮件的数据库中创建/更新本地用户帐户。我的问题是电子邮件声明(现在是v2中的可选声明)为空,因此我无法在本地数据库中插入新的用户记录 我已经通过MS并在应用程序注册清单等中配置了我的可选声明,但它不起作用。我尝试了所有3种索赔变更(电子邮件、已验证的主要电子邮件、已验证的次要电子邮件),但都没有成功。但是,给定_名称和族_名称的可选声明按预期

我正在使用Azure AD IAM将托管在Azure应用程序服务中的asp net核心MVC web应用程序从v1迁移到v2。当用户登录时,我在包含用户电子邮件的数据库中创建/更新本地用户帐户。我的问题是电子邮件声明(现在是v2中的可选声明)为空,因此我无法在本地数据库中插入新的用户记录

我已经通过MS并在应用程序注册清单等中配置了我的可选声明,但它不起作用。我尝试了所有3种索赔变更(电子邮件、已验证的主要电子邮件、已验证的次要电子邮件),但都没有成功。但是,给定_名称和族_名称的可选声明按预期工作,因此配置必须正确。我怎样才能得到电子邮件来上班

下面是我的配置和结果

应用程序注册清单

应用程序注册权限

用户配置文件设置(直接分配成员的电子邮件配置)

返回的索赔

启动配置(添加电子邮件范围)

返回的令牌(电子邮件声明仍然丢失)


更新2019-08-26

我怀疑问题出在用户帐户上。作为目录管理员,我在AAD中创建用户帐户,并输入电子邮件和备用电子邮件值。但是,当我以最终用户身份登录AAD并查看我的个人资料时,我可以看到电子邮件字段为空,仅填充备用电子邮件字段,如下所示。我不确定为什么用户配置文件没有提取设置的电子邮件地址,但这是一个问题,我现在必须找到一种方法,将备用电子邮件改为ID令牌。如何做到这一点

AAD中的电子邮件地址

用户档案中的电子邮件地址
仅仅是一些发现和建议,可能不是一个确切的答案

基于Microsoft提供的:

A.索赔的名称是电子邮件。

B.当您从V1迁移到V2时,我刚刚测试了V2(为了方便起见,我使用restapi工具进行了测试)。通过添加openid和电子邮件作用域,我可以在id令牌中获得电子邮件声明。

C.分析jwt.io中的id令牌,我可以得到电子邮件声明:


我没有修改清单,只是添加了openid和电子邮件范围。你可以试一试

您是否有机会检查此-?@DmitryPavlov yep查看了该页面以确认我的清单具有正确的配置和可选声明名称等。我觉得一切正常。我可以知道您在获取令牌时是否添加了电子邮件范围吗?如果我添加电子邮件范围,我就可以收到电子邮件。@JackJia MS文档中说“对于托管用户(租户内部的用户),必须通过此可选声明或仅在v2.0上使用OpenID范围请求。对于托管用户,必须在Office admin portal中设置电子邮件地址。”因此,您似乎可以选择添加可选声明或添加范围。但是,我认为我已经使用上面显示的Microsoft Graph API权限定义了电子邮件范围。这是正确的吗?我尝试了你们的建议,并用额外的信息更新了问题。不幸的是,即使包含了电子邮件范围,电子邮件仍然无法返回。我想知道这是否与本MS声明最后一部分所定义的Office Admin portal有关“对于托管用户(租户内部的用户),必须通过此可选声明请求,或者仅在v2.0上使用OpenID范围。对于托管用户,必须在Office Admin portal中设置电子邮件地址。”这对我没有帮助,因为我根本没有Office 365。
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
    .AddAzureAD(options => Configuration.Bind("AzureAd", options));

services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
{
    options.Authority += "/v2.0/";
    options.Scope.Add("email");
    options.TokenValidationParameters.ValidateIssuer = true;

    // Set the nameClaimType to be preferred_username.
    // This change is needed because certain token claims from Azure AD v1.0 endpoint
    // (on which the original .NET core template is based) are different in Microsoft identity platform endpoint.
    // For more details see [ID Tokens](https://docs.microsoft.com/azure/active-directory/develop/id-tokens)
    // and [Access Tokens](https://docs.microsoft.com/azure/active-directory/develop/access-tokens)
    options.TokenValidationParameters.NameClaimType = "preferred_username";
}
https://login.microsoftonline.com/28f6d551-***-7f402200e732/oauth2/v2.0/authorize
?client_id=08fde457-***-7b0eebc5e4e2
&redirect_uri=https%3A%2F%2Flocalhost%3A44308%2Fsignin-oidc
&response_type=id_token
&scope=openid%20profile%20email
&response_mode=form_post
&nonce=637023698441049167.ZWZlMGQ1MzctZDVmMi00OGZlLTg5YzYtMjczOWIxNzlhYjI0MzdiNGI2YzMtZTFjYi00MDMxLWFkODItNmExNDlmZTQ2MWE1&state=CfDJ8Em5zZW9XwdJkjHAUddTGuvClgDAA0NFafwsZBlTbau2qhMPcRBM36vSSzFEw7GME28L57BSQyGo8WNNzd61_bciTunD0R15oC__96_tXlWaPmk3jZkOpA2VUoiwG9XrZjfDOTQIWAzS2IuqUu5gXWU8dgK7YEfyAuRwVmCQlWqlt94HPUwMSsSJpMsdlB6HD3Tb0DaPCspo2BiYga-5LWDQ5FBnFCpxPAdLNa6LTHHNtKjUbG7YNX4oEKUBhWtxQ0Kh1CakChUFCpmMzAmBgyN5Hh_-nk3BrO3V6PrgbvDsGO6QNip5hCwiDd92gexrLYwS_UeKruPKCQMZBWZ9LnSRaNnTDN1483Abk75JiH19XPJwexmQ5aMa1KZwcde4axF-tb2cmnwWY8O4NGhRiQDSISZJAuXmHWBtAeNhnLHN659vbeiW8mo5aWD65NcfhLtio2odxvLFh3JZGoRwHCtKzu9fq8v4w7IN2f1bNb8zPdo7Lw_GREiYKs1twibIh305tja30MMRS3oAE1hKQE20A4wtmxVACuPZ201SRkFg8OHl-Iz6e4Pa41P4gT-F2jpzL1zqklDw0tzaYq68uVlqmeCY5T9vo2qkfvRuIdpyyTGu8pdi-Z6sVvIpIxPllQ
&x-client-SKU=ID_NETSTANDARD2_0
&x-client-ver=5.3.0.0