asp.net-core-mvc - 带有 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 令牌。如何才能做到这一点?
解决方案
只是一些发现和建议,可能不是一个确切的答案。
根据 Microsoft 的文档(可选声明):
A. 索赔的名称是电子邮件。
B. 当您从 V1 迁移到 V2 时,我刚刚测试了 V2(为方便起见,我使用 REST API 工具进行了测试)。通过添加 openid 和 email 范围,我可以在 id 令牌中获取电子邮件声明。
C. 分析 jwt.io 中的 id token,可以得到 email 声明:
我没有修改清单,只是添加了 openid 和电子邮件范围。你可以试一试。
推荐阅读
- dictionary - V3 NMT 中字典功能的预计发布日期
- swift -
- android - Android:使用PagedList时如何添加项目和刷新列表?
- grails - 通过 gsp g:link 传递 Flash 消息
- ios - 为什么在 Swift 4.2 中从 SceneKit 节点转换为数据时出现“inout simd_float3”(又名“inout float3”)不可转换为“float3”错误?
- android - Fabric Beta 发行说明和 Gradle Kotlin DSL
- node.js - Azure 节点 expressjs 应用程序随机崩溃而没有错误
- php - 将尾部斜杠添加到 URL 时出现内部服务器错误
- c# - REST API 的版本控制格式
- django - 如何使用 Django 发送带有粗体字符串的电子邮件