Asp.net core 如何使用Azure Active Directory在ASP.NET核心应用程序中获取经过身份验证的用户的名称
在连接并配置Azure AD的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中查找,用户确实有完整的名字和姓氏。在网上
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>
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;