从 Azure AD 中获取用户的令牌主题标识符(子)

Posted

技术标签:

【中文标题】从 Azure AD 中获取用户的令牌主题标识符(子)【英文标题】:Getting User's Token Subject Identifier (sub) From Within Azure AD 【发布时间】:2015-12-07 06:14:31 【问题描述】:

我的网络应用程序正在使用多个 OAuth 2.0 身份提供程序,并且希望从访问令牌响应的 id_token 中检索“sub”并将其与存储在我的应用程序数据库中的一个匹配,因为'sub' 是用户所在系统的唯一 ID,它是 id_token 中的一个标准字段。

我的问题是: 从 Azure AD 门户中检索用户的 Token Subject Identifier(又名 sub)是否有明显/方便的方法?我知道“Object ID”(又名 Object Identifieroid)是 Azure AD 门户中用户配置文件的一部分。但是,'oid' 不是 JWT id_token 中的标准字段(例如 Azure AD 使用它,但 Google Identity 没有),但 'sub' 是。

【问题讨论】:

你是什么意思:“来自 Azure AD”?是否要从 C# 代码中的 JWT 令牌中提取 sub? 我的意思是来自 Azure AD 门户。我会更新帖子。对困惑感到抱歉。我的应用程序需要事先将用户的标识符(子)导入其数据库。我只是无法从 Azure AD 门户轻松找到它们。 【参考方案1】:

在 Azure 管理门户中,您只能看到 Active Directory 中用户的对象 ID。

但在 C# 代码中,如果您拥有该用户的 JWT 令牌,您可以像下面这样对其进行解码并从中获取您想要的任何属性:

var token = new JwtSecurityToken(jwtToken);
var oid = token.Claims.FirstOrDefault(m=>m.Type == "oid").Value;
var sub = token.Claims.FirstOrDefault(m => m.Type == "sub").Value;

但是,如果您没有用户的用户名密码,则无法从 AAD 为他们获取 JWT 令牌。

或者,您可以使用 AAD Graph API 从 AAD 获取更详细的用户信息,但即使 Azure Graph API 在响应中也不会有“SUB”,而只有 Object Id:

https://msdn.microsoft.com/en-us/library/azure/dn151678.aspx

这是使用 AAD Graph 的 GET 用户调用的响应:


    "odata.metadata": "https://graph.windows.net/contoso.onmicrosoft.com/$metadata#directoryObjects/Microsoft.WindowsAzure.ActiveDirectory.User/@Element",
    "odata.type": "Microsoft.WindowsAzure.ActiveDirectory.User",
    "objectType": "User",
    "objectId": "4e971521-101a-4311-94f4-0917d7218b4e",
    "accountEnabled": true,
    "assignedLicenses": [],
    "assignedPlans": [],
    "city": null,
    "country": null,
    "department": null,
    "dirSyncEnabled": null,
    "displayName": "Alex Wu",
    "facsimileTelephoneNumber": null,
    "givenName": null,
    "jobTitle": null,
    "lastDirSyncTime": null,
    "mail": null,
    "mailNickname": "AlexW",
    "mobile": null,
    "otherMails": [],
    "passwordPolicies": null,
    "passwordProfile": null,
    "physicalDeliveryOfficeName": null,
    "postalCode": null,
    "preferredLanguage": null,
    "provisionedPlans": [],
    "provisioningErrors": [],
    "proxyAddresses": [],
    "state": null,
    "streetAddress": null,
    "surname": null,
    "telephoneNumber": null,
    "usageLocation": null,
    "userPrincipalName": "Alex@contoso.onmicrosoft.com"

【讨论】:

感谢您的详细回答。它确实回答了发布的问题。 如果我想将许多用户的“sub”批量上传到我的网络应用程序怎么办?一旦身份验证过程返回带有 JWT 的响应,我的应用程序将提取“sub”并将其与存储在数据库中的那个进行比较,并查看该用户是否已在我的应用程序中注册。现在看来,要获得很多用户的'sub'是非常困难的。 图更新用户api中好像不能指定sub:msdn.microsoft.com/en-us/library/azure/dn130117.aspx 不。但无论如何,现在似乎我需要为 MS AAD 进行一些自定义以提取“oid”而不是“sub”。 这没有回答问题。

以上是关于从 Azure AD 中获取用户的令牌主题标识符(子)的主要内容,如果未能解决你的问题,请参考以下文章

从 Azure AD 发出 JWT 令牌中的角色

Azure AD 令牌中的哪些 JWT 声明可以安全地用于用户映射?

使用 Angular 8 中的 MSAL 库获取 Microsoft Azure AD 组名称列表

尝试从 Azure AD 获取访问令牌时获取响应代码 400

使用用户模拟来调用Azure AD Microsoft API的Web API

在 Azure B2C 中获取刷新令牌,Azure AD App 是第三方 IDP