我们想使用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完全无效。
所以我们的问题是,什么是正确的方法:
对Secure API with Azure AD/B2C users的一些答案建议创建第二个应用程序以查询Graph API。那是实现我们目标的唯一方法吗?
答案 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。