Asp.net core 如何使用Azure Active Directory在ASP.NET核心应用程序中获取经过身份验证的用户的名称

Asp.net core 如何使用Azure Active Directory在ASP.NET核心应用程序中获取经过身份验证的用户的名称,asp.net-core,web-applications,azure-active-directory,Asp.net Core,Web Applications,Azure Active Directory,在连接并配置Azure AD的ASP.NET核心应用程序中。我可以使用以下代码获取名称标识符: var user = User.FindFirst(ClaimTypes.NameIdentifier).Value; ✔️ 尝试仅获取具有以下代码行的名称时: var user = User.FindFirst(ClaimTypes.Name).Value; ❌ 我收到以下错误: 对象引用未设置为对象的实例 在Azure Active Directory中查找,用户确实有完整的名字和姓氏。在网上

在连接并配置Azure AD的ASP.NET核心应用程序中。我可以使用以下代码获取名称标识符:

var user = User.FindFirst(ClaimTypes.NameIdentifier).Value; ✔️
尝试仅获取具有以下代码行的名称时:

var user = User.FindFirst(ClaimTypes.Name).Value; ❌
我收到以下错误:

对象引用未设置为对象的实例

在Azure Active Directory中查找,用户确实有完整的名字和姓氏。在网上尝试了很多例子,看起来应该显示名称

更新:

最后我终于明白了,起初我设法得到了所有人类可读的文本,如下所示:

foreach (Claim item in User.Claims)
{
    if (item.Type.Contains("name"))
    {
      var username = item.Value;
    }
}
这样好多了

var userName = User.FindFirst("name").Value;
根据文件:

在ASP.NET Core中,OpenID Connect中间件在填充用户主体的声明集合时会转换某些声明类型:

  • oid>

  • tid>

  • 唯一\u名称>

  • upn>

因此,如果ID令牌中存在唯一的_名称,中间件将填充
ClaimTypes.name
的值。但根据文件:

unique_name:提供一个人类可读的值,用于标识令牌的主题。此值不能保证在租户中是唯一的,只能用于显示目的。仅以v1.0 id_代币发行

因此,该声明仅在Azure AD V1.0 id令牌中发布,并且不保证在租户中是唯一的

您可以通过以下方式获取用户名和电子邮件(需要
配置文件
范围才能使用Azure AD V2.0应用程序接收索赔和测试):

如果您想知道当前用户的名字和姓氏,您可以获取Microsoft Graph的访问令牌,使用令牌调用用户端点,并从响应中检查
givenName
/
姓氏
值:

var userName=User.FindFirst(“name”).Value;//正是我想要的,谢谢
var userName = User.FindFirst("name").Value;
var Email = User.FindFirst("preferred_username").Value;