Azure AD B2C在令牌请求时返回AADSTS70000错误

时间:2017-10-18 14:44:11

标签: azure azure-active-directory azure-ad-b2c

我有一个Web API试图为B2C用户获取访问权限和刷新令牌。用户登录是通过配置的“社交身份提供商”完成的。

API接收授权码。在为代币交换代码时,Azure AD B2C租户的端点端点返回invalid_grant错误。

我已经查看了我在网站上找到的其他答案。问题仍然存在。指针非常受欢迎。

详情如下。

注册和登录个人资料会发出

的声明
  • 名字
  • 电子邮件
  • 身份提供商
  • 对象ID

令牌端点出错:

{
    "error": "invalid_grant",
    "error_description": "AADSTS70000: Transmission data parser failure: Authorization Code is malformed or invalid. [...]",
    "error_codes": [
        70000
    ],
    [...]
}

授权请求如下:

AUTHORIZATION_ENDPOINT = 'https://login.microsoftonline.com/<tenant_id>/oauth2/v2.0/authorize'

authorization_url = f'{AUTHORIZATION_ENDPOINT}' \
    f'?client_id={CLIENT_ID}' \
    f'&response_type=code' \
    f'&redirect_uri=http%3A%2F%2Flocalhost%3A8000%2Fcode' \
    f'&scope=openid offline_access' \
    f'&nonce=hellobob' \
    f'&p=B2C_1_<profile>'

根据用户授权,API会将授权码POST发送到令牌端点。 Payload表示为Python字典。

TOKEN_ENDPOINT = 'https://login.microsoftonline.com/<tenant_id>/oauth2/v2.0/token'
payload = {
    'p': 'B2C_1_<profile>',
    'client_id': CLIENT_ID,
    'client_secret': CLIENT_SECRET,
    'code': code,
    'grant_type': 'authorization_code',
    'redirect_uri': 'http://localhost:8000/code',
    'scope': 'openid offline_access'
}

response = requests.post(TOKEN_ENDPOINT, data=payload)

2 个答案:

答案 0 :(得分:1)

此错误通常表示您获得的身份验证代码不适用于指定端点上的令牌。这可能是由于错误配置auth端点,在错误的位置注册应用程序或格式错误的请求。要标注的一件事是,大多数B2C错误都是aadb2cxxxxx的形式,而不是aadstsxxxxx的传统Azure AD错误格式。

首先要检查此错误是您的auth端点。从上面的片段看,两者看起来都很好。

接下来要确保您使用正确的库来获取授权码。您尚未在客户端上显示代码,但如果它使用ADAL库或v1.0端点,则您的身份验证代码将无法在/v2.0/端点上兑换。

我还看到,当在Azure门户中的不正确的刀片中注册应用程序时会发生这种情况。确保您注册了Azure AD B2C应用程序而不是纯Azure AD应用程序。

如果你这样做了,我建议尝试两件事:

  1. 使用其中一个代码示例中的test B2C application而不是您的应用注册,看看它是否有效。如果是,您知道您有注册问题。这个registration guide可能有助于诊断。

  2. 使用您的应用注册(而非代码)手动执行请求。这将帮助您了解它是否是代码问题。 Construct the request并使用Curl或Postman,然后交换代码。简单的替代方法是将您的配置插入样本中。

答案 1 :(得分:1)

令牌端点的URL不正确。授权和令牌端点URL需要包含B2C配置文件作为其查询参数的一部分,例如https://login.microsoftonline.com/<tenant_id>/oauth2/v2.0/token?p=<B2C_profile>

或者,您可以分别使用以下URL来授权和令牌端点:

  • https://login.microsoftonline.com/te/<tenant>.onmicrosoft.com/<B2C_profile>/oauth2/v2.0/authorize
  • https://login.microsoftonline.com/te/<tenant>.onmicrosoft.com/<B2C_profile>/oauth2/v2.0/token

B2C_profile的值为小写。

OpenID发现文档位于https://login.microsoftonline.com/te/<tenant>.onmicrosoft.com/<B2C_profile>/v2.0/.well-known/openid-configuration

请注意,OpenID提供程序配置文档将基础Azure AD列为令牌颁发者,从而难以确定令牌是源自Azure AD还是B2C。但是,B2C令牌似乎包含tfp - 声明referring to the policy name正在使用。

此外,B2C使用与声明的令牌发行者不同的签名密钥。确认在验证令牌时使用B2C密钥!