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

4 web-applications azure-active-directory asp.net-core

在已连接和配置 Azure AD 的 ASP.NET Core 应用程序中。我可以使用以下代码获取 NameIdentifier:

var user = User.FindFirst(ClaimTypes.NameIdentifier).Value; ??
Run Code Online (Sandbox Code Playgroud)

当尝试使用以下代码行获取名称时:

var user = User.FindFirst(ClaimTypes.Name).Value; ?
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

你调用的对象是空的。

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

更新:

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

foreach (Claim item in User.Claims)
{
    if (item.Type.Contains("name"))
    {
      var username = item.Value;
    }
}
Run Code Online (Sandbox Code Playgroud)

这好多了

var userName = User.FindFirst("name").Value;
Run Code Online (Sandbox Code Playgroud)

Nan*_* Yu 8

根据文件:https : //docs.microsoft.com/en-us/azure/architecture/multitenant-identity/claims

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

这样,如果 ID 令牌中存在 unique_name ,中间件将填充 的值ClaimTypes.Name。但根据文档:Microsoft 身份平台 ID 令牌

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

这样声明仅在 Azure AD V1.0 id 令牌中发出,并且不保证它在租户中是唯一的。

您可以通过以下方式获取用户名和电子邮件(profile使用 Azure AD V2.0 应用程序接收声明和测试需要范围):

var userName = User.FindFirst("name").Value;
var Email = User.FindFirst("preferred_username").Value;
Run Code Online (Sandbox Code Playgroud)

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

https://docs.microsoft.com/en-us/graph/api/user-get?view=graph-rest-1.0&tabs=http