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

11
我的Web应用正在使用多个OAuth 2.0身份提供程序,并希望从Access Token响应的id_token中检索“sub”,并将其与存储在我的应用程序的数据库中的一个进行匹配,因为“sub”是用户所在的任何系统中唯一的ID,它是id_token中的一个标准字段。
我的问题是: 是否有明显/方便的方法可以从Azure AD门户内检索用户的令牌主题标识符(也称为“sub”)?我知道“Object ID”(也称为“对象标识符”或“oid”)是Azure AD门户中用户配置文件的一部分。但是,“oid”不是JWT id_token中的标准字段(例如,Azure AD使用它,但Google Identity没有),但“sub”是。

你是什么意思:“从Azure AD内部”?你想在C#代码中提取JWT令牌中的子吗? - Aram
我是指从Azure AD门户。我会更新帖子。对于混淆我感到抱歉。我的应用程序需要事先将用户标识符(sub)导入其数据库。我只是无法在Azure AD门户中轻松找到它们。 - gye
1个回答

8
从Azure管理门户中,您只能看到Active Directory中用户的Object ID。

enter image description here

但是在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”,只有对象ID。

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

以下是使用AAD Graph调用GET Users的响应结果:
{
    "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"
}

感谢您提供这么详细的答案。它确实回答了所发布的问题。 - gye
如果我想批量上传许多用户的“sub”到我的 Web 应用程序怎么办?一旦身份验证过程返回带有 JWT 的响应,我的应用程序将提取“sub”并将其与存储在数据库中的“sub”进行比较,并查看此用户是否已在我的应用程序中注册。现在似乎很难获取许多用户的“sub”。 - gye
在 Graph Update 用户 API 中似乎无法指定子项:https://msdn.microsoft.com/zh-cn/library/azure/dn130117.aspx - Aram
1
不行。但是无论如何,现在似乎我需要进行一些定制,只为了从MS AAD中提取“oid”而不是“sub”。 - gye
4
这并没有回答这个问题。 - Warren Parad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接