代码之家  ›  专栏  ›  技术社区  ›  seebiscuit

如何使用Microsoft Graph API从用户配置文件中获取组织(租户)ID

  •  3
  • seebiscuit  · 技术社区  · 8 年前

    我正在创建一个外接程序,使用组织许可证销售。

    我已经在外接程序上实现了身份验证方案。我现在要求 User.Read 使用和Azure v2终结点进行可靠身份验证的范围。要获取用户信息,我正在查询

    https://graph.microsoft.com/v1.0/me
    

    要正确测试用户的许可证,我需要提取用户组织的标识。然而,我从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
    

    我得到了更多的信息,但是没有什么能帮助我在用户的组织中确定唯一的ID。

    是否需要使用其他范围来获取用户组织的信息?如果没有,我可以依赖于将用户电子邮件中的域名解析为用户组织的唯一ID吗?是否需要查询其他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"
    }
    

    更新:完整的广告响应使用 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"
    }
    

    更新:解码 access_token 带JWT.MS

    {
      "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]
    
    2 回复  |  直到 8 年前
        1
  •  3
  •   juunas    8 年前

    如果没有其他方法,您可以解码访问令牌并获取 tid 索赔。这是Azure AD租户的ID。

    您可以在这里找到代币声明的文档: https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-token-and-claims

    例如,它的意思是 蒂德 :

    标识颁发令牌的目录租户的不可变、不可重用的标识符。可以使用此值访问多租户应用程序中特定于租户的目录资源。例如,您可以使用这个值来标识调用图形API的租户。

        2
  •  2
  •   Ben    7 年前

    现在,这可能不是直接使用图形API,而是使获取组织的租户ID变得非常简单。去吧” https://login.microsoftonline.com/ 您的域名/。知名/OpenID配置”。返回的结构将具有租户ID。请尝试此URL,例如在浏览器中: https://login.microsoftonline.com/microsoft.com/.well-known/openid-configuration .

    推荐文章