【问题标题】:Accessing user data from Azure B2C AD with OAuth 2.0使用 OAuth 2.0 从 Azure B2C AD 访问用户数据
【发布时间】:2019-03-28 01:14:32
【问题描述】:

我们希望使用 OAuth 2.0 对我们的 Web 应用程序的用户进行身份验证 通过 Azure B2C AD。管理 B2C AD 的用户将来自不同的 来源,有些是我们自己创建的,但大多数会自己注册并 我们希望启用其他身份提供商,例如 Github 或 Google, 因此 Azure B2C AD 而不是 Azure Active Directory。我们也想 将这些用户(包括一些自行注册的用户)放入 组。

基本身份验证工作流程(包括注册流程) 工作:我们在 B2C 租户中创建了一个应用程序,启用了 Web API 访问, 生成用于登录和签名的客户端密码和用户流 设置并设置我们的第 3 方身份提供商。

我们在 https://<tenant>.b2clogin.com/tfp/<tenant>.onmicrosoft.com/<user-flow>/oauth2/v2.0/authorize?client_id=<client-id>&redirect_uri=<redirect-uri>&scope=<client-id>&response_type=code

用户返回一个有效的授权码,我们用它来 使用以下 POST 数据从 https://<tenant>.b2clogin.com/tfp/<tenant>.onmicrosoft.com/<user-flow>/oauth2/v2.0/token 请求访问令牌:

{
    "code":"<authorization-code>",
    "client_id":"<client-id>",
    "client_secret":"<client-secret>",
    "redirect_uri":"<redirect-uri>",
    "grant_type":"authorization_code"
}

然后我们想使用这个访问令牌来获取用户的个人资料数据 (包括用户名、电子邮件和组成员身份)来自 Azure AD Graph API (https://graph.windows.net//me?api-version=1.6)。文档 明确表示 B2C 目录不得使用新的 Microsoft 图 APIhttps://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-graph-dotnet

API 响应令牌已过期:

<?xml version="1.0" encoding="utf-8"?><error
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><code>Authentication_ExpiredToken</code><message
xml:lang="en">Your access token has expired. Please renew it before
submitting the request.</message></error>

https://jwt.ms/解码的令牌中的时间戳却另有说明:

{
  "typ": "JWT",
  "alg": "RS256",
  "kid": "X5eXk4xyojNFum1kl2Ytv8dlNP4-c57dO6QGTVBwaNk"
}.{
  "iss": "https://<tenant>.b2clogin.com/<id>/v2.0/",
  "exp": 1553689573,
  "nbf": 1553685973,
  "aud": "<client-id>",
  "idp": "github.com",
  "name": "<username>",
  "oid": "<oid>",
  "sub": "<sub>",
  "emails": [
    "<email>"
  ],
  "tfp": "B2C_1_SignupAndSignin",
  "azp": "<client-id>",
  "ver": "1.0",
  "iat": 1553685973
}.[Signature]

但是,令牌中的 aud 只是我们的应用程序,而不是 Azure AD 图形 API。这表明 Azure B2C AD 颁发的令牌是 对 Graph API 根本无效。

所以我们的问题是,正确的方法是:

  • 为 B2C AD 用户获取访问令牌,这将允许我们获取用户信息
  • 读取经过身份验证的 B2C AD 用户的个人资料和组成员身份

Secure API with Azure AD/B2C users 的一些答案建议创建第二个应用程序来查询 Graph API。这是实现我们目标的唯一途径吗?

【问题讨论】:

    标签: azure oauth-2.0 azure-ad-b2c


    【解决方案1】:

    我认为您无法使用 B2C 令牌访问 Azure AD Graph API。

    您可以使用 B2C 令牌访问受 B2C 保护的某些资源,例如Azure Function 或您的应用。

    在这种情况下,我认为您需要使用服务帐户代表您的用户连接到 Azure AD Graph API。您的应用程序在服务器端将需要实施必要的基于角色的访问控制 - 例如仅获取当前用户信息。您可以在您的应用中使用 B2C 令牌 (after it has been validated) 来发现当前用户是谁。

    Azure AD B2C: Use the Azure AD Graph API

    对于 B2C 租户,有两种主要的沟通方式 图形 API。

    • 对于交互式的一次性任务,您应该在执行任务时充当 B2C 租户中的管理员帐户。这种模式 在此之前需要管理员使用凭据登录 管理员可以对 Graph API 执行任何调用。
    • 对于自动化、连续的任务,您应该使用某种类型的服务帐户,您提供的服务帐户具有执行所需的权限 管理任务。 在 Azure AD 中,您可以通过注册一个 应用程序并向 Azure AD 进行身份验证。 这是通过使用 使用 OAuth 2.0 客户端凭据授权的应用程序 ID。 在 在这种情况下,应用程序作为自己而不是用户来调用 图形 API。

    【讨论】:

    • 感谢您的澄清。最后,我们决定简化身份验证工作流程,并使用带有单个令牌请求的 OpenID:&amp;scope=openid&amp;response_type=id_token&amp;response_mode=form_post
    猜你喜欢
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多