使用OAuth 2.0从Azure B2C AD访问用户数据

时间:2019-03-27 13:14:03

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

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

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

我们在以下位置启动用户身份验证 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 图形API https://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。那是实现我们目标的唯一方法吗?

1 个答案:

答案 0 :(得分:0)

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

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

在这种情况下,我认为您将需要使用服务帐户代表用户连接到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。
  •