如何使用Microsoft Graph API从用户资料中获取组织(租户)ID

18

我正在创建一个插件,打算使用组织许可证进行销售。

我已经在插件上实施了身份验证方案。目前,我正在请求User.Read范围,以便在 Azure v2 端点上进行确定的身份验证。为了获取用户信息,我正在查询

https://graph.microsoft.com/v1.0/me
为了正确测试用户的许可证,我需要提取用户所属组织的标识。然而,我从Grah请求中收到的用户信息非常匮乏。对于AAD帐户,模式看起来像这样:

要正确测试用户的许可证,我需要提取用户所属组织的标识。 然而,我从Grah请求中收到的用户信息非常匮乏。 对于AAD帐户,模式看起来像:

{
  "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users/$entity",
  businessPhones: [],
  displayName: "FirstName LastName",
  givenName: "FirstName",
  id: "unique-id",
  jobTitle: null,
  mail: "First.LastName@COMPANYDOMAIN.COM",
  mobilePhone: null,
  officeLocation: null,
  preferredLanguage: null,
  surname: "LastName",
  userPrincipalName: "FILastName@COMPANYDOMAIN.COM"
}

如果我使用

https://graph.microsoft.com/BETA/me

我获得了更多的信息,但没有帮助我确定用户组织的唯一标识符。

是否需要使用不同的范围来获取用户组织的信息?如果没有,我能否依靠从用户电子邮件中解析域名作为用户组织的唯一标识符?我需要查询不同的API吗?

更新:OAuth响应

如果有帮助的话,在用户通过AD进行身份验证后,我收到以下响应:

{
    access_token: "eyJ0eXAiOiJKV1QiLCJub25jZSI6IkFRQUJBQUFBQUFEWDhHQ2k2SnM2U0s4MlRzRDJQYjdyN1VLTzdJSDJSLWpTcmpScU9..."
    expires_at: Fri May 18 2018 07: 18: 42 GMT - 0400(Eastern Daylight Time) {}
    expires_in: "3599"
    provider: "Microsoft"
    scope: "https://graph.microsoft.com/User.Read"
    session_state: "012f4565-31bb-..."
    state: "259309..."
    token_type: "Bearer"
}

更新:完整的 AD 响应使用 https://graph.microsoft.com/BETA/me

{
    @odata.context: "https://graph.microsoft.com/beta/$metadata#users/$entity",
        accountEnabled: true,
        ageGroup: null,
        assignedLicenses: [],
        assignedPlans: [],
        businessPhones: [],
        city: null,
        companyName: null,
        consentProvidedForMinor: null,
        country: null,
        deletedDateTime: null,
        department: null,
        deviceKeys: [],
        displayName: "FirstName LastName",
        employeeId: null,
        givenName: "FirstName",
        id: "ebdcf715-43c5-4f48-ad0d-b798a3330849",
        imAddresses: [],
        jobTitle: null,
        legalAgeGroupClassification: null,
        mail: "FirstName.LastName@COMPANYDOMAIN.COM",
        mailNickname: "FirstName.LastName",
        mobilePhone: null,
        officeLocation: null,
        onPremisesDomainName: "COMPANYDOMAIN.COM",
        onPremisesExtensionAttributes: {
            
        },
        onPremisesImmutableId: "...RVWAty...",
        onPremisesLastSyncDateTime: "2018-05-10T18:13:45Z",
        onPremisesProvisioningErrors: [],
        onPremisesSamAccountName: "FILastName",
        onPremisesSecurityIdentifier: "...-21-1412366426-...",
        onPremisesSyncEnabled: true,
        onPremisesUserPrincipalName: "FILastName@COMPANYDOMAIN.COM",
        passwordPolicies: "DisablePasswordExpiration",
        passwordProfile: null,
        postalCode: null,
        preferredDataLocation: null,
        preferredLanguage: null,
        provisionedPlans: [],
        proxyAddresses: [],
        refreshTokensValidFromDateTime: "2018-05-10T17:54:45Z",
        showInAddressList: null,
        state: null,
        streetAddress: null,
        surname: "LastName",
        usageLocation: "US",
        userPrincipalName: "FILastName@COMPANYDOMAIN.COM",
        userType: "Member"
}

更新:使用jwt.ms解码access_token

{
  "typ": "",
  "nonce": "",
  "alg": "",
  "x5t": "",
  "kid": "iBjL1Rcqzhiy4fpxIxdZqohM2Yk"
}.{
  "aud": "",
  "iss": "",
  "iat": "",
  "nbf": "",
  "exp": "",
  "acr": "",
  "aio": "",
  "amr": [
    "pwd"
  ],
  "app_displayname": "",
  "appid": "",
  "appidacr": "",
  "family_name": "",
  "given_name": "",
  "ipaddr": "",
  "name": "",
  "oid": "",
  "onprem_sid": "",
  "platf": "",
  "puid": "",
  "scp": "",
  "sub": "",
  "tid": "",
  "unique_name": "",
  "upn": "",
  "uti": "",
  "ver": "1.0"
}.[Signature]

用户登录后,您应该获取一个ID令牌。其中包含租户ID。 - juunas
@juunas 你是指 access_token 吗?我该如何从中提取租户 ID?也许你想发布一个带有详细信息的完整答案? - seebiscuit
我的意思是id_token,在这种情况下对您不可用吗? - juunas
如果在 https://jwt.ms 上解码访问令牌,你能看到用户信息吗? - juunas
好的,如果其他方法都不行,你可以从令牌中获取 tid。那是组织ID。 - juunas
显示剩余3条评论
3个回答

20

这似乎可以工作

GET https://graph.microsoft.com/v1.0/organization 

id属性是租户ID。

Grahp Explorer链接


这个可行,能否分享一下你使用的请求体文档? - saikumar
1
这是一个GET请求。没有正文内容。将更新答案。 - Alon Catz

13

非常适合先请求域,然后检查它,最后请求管理员授权。否则,我的守护进程应用程序需要进行两次身份验证。(也请参阅https://github.com/Azure-Samples/ms-identity-aspnet-daemon-webapp) - Thomas Williams

6
如果其他方法都不起作用,您可以解码访问令牌并获取tid声明。这是Azure AD租户的ID。
您可以在此处找到有关令牌中声明的文档:https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-token-and-claims 例如,tid的说明如下:

一个不可变的、不可重复使用的标识符,用于标识发出令牌的目录租户。您可以使用此值在多租户应用程序中访问特定于租户的目录资源。例如,您可以使用此值在调用Graph API时标识租户。


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