首页 > 解决方案 > 带有 Azure 应用注册的 Azure AD v2 在直接分配的用户的 ID 令牌中缺少可选的电子邮件声明

问题描述

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

我已经阅读了 MS文档并在应用程序注册清单等中配置了我的可选声明,但它不起作用。我已经尝试了所有 3 个声明变体(电子邮件、verified_primary_email、verified_secondary_email),但没有通过。但是, given_name 和 family_name 的可选声明按预期工作,因此配置必须正确。我怎样才能让电子邮件工作?

下面是我的配置和结果。

应用注册清单 在此处输入图像描述

应用注册权限 在此处输入图像描述

用户配置文件设置(直接分配成员的电子邮件配置) 在此处输入图像描述 在此处输入图像描述

退回索赔 在此处输入图像描述

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

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

返回的令牌(电子邮件声明仍然丢失) 在此处输入图像描述


更新 2019-08-26

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

AAD 中的电子邮件地址 在此处输入图像描述

用户资料中的电子邮件地址 在此处输入图像描述

标签: asp.net-core-mvcazure-active-directorymicrosoft-graph-apiopenid-connect

解决方案


只是一些发现和建议,可能不是一个确切的答案。

根据 Microsoft 的文档(可选声明)在此处输入图像描述

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

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

在此处输入图像描述

C. 分析 jwt.io 中的 id token,可以得到 email 声明:

在此处输入图像描述

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


推荐阅读