使用 Azure AD 通过 OAuth2 对 Azure API 管理进行身份验证

bee*_*est 5 oauth-2.0 azure-active-directory azure-api-management

我正在尝试通过 AzureAD 使用 OAuth2 来保护 APIM API,方法是阅读以下文章:通过使用 Azure AD 的 OAuth 2.0 授权保护 Azure API 管理中的 Web API 后端

AzureAPIM - OAuth2

AzureAD - 后端应用程序:

  • 范围:文件.全部

AzureAD - 客户端应用程序:

对于演示会议 API,将验证 JWT 策略添加到入站处理,其中3a0cf09b-是租户 id,b7c31179-是后端应用程序应用程序 id: 在此输入图像描述

在开发人员门户中,AzureAD 身份验证成功并返回令牌: 在此输入图像描述

但是调用API授权失败: 在此输入图像描述

检查 jwt.io 中收到的令牌,我发现"aud": "00000003-0000-0000-c000-000000000000"不是后端应用程序应用程序 ID:

{
  "aud": "00000003-0000-0000-c000-000000000000",
  "iss": "https://sts.windows.net/3a0cf09b-xxx/",
  "app_displayname": "client-app",
  "appid": "05a245fb-xxx",
  "scp": "Files.Read User.Read profile openid email",
  "tenant_region_scope": "OC",
  "tid": "3a0cf09b-2952-4673-9ace-0e1bf69ee23a",
  "unique_name": "user1@xxx.onmicrosoft.com",
}
Run Code Online (Sandbox Code Playgroud)

API 测试 HTTP 响应跟踪显示 validate-jwt 上的错误:

validate-jwt (-0.138 ms)
{
    "message": "JWT Validation Failed: Claim value mismatch: aud=b7c31179-xxx.."
}
Run Code Online (Sandbox Code Playgroud)

替换aud为令牌中的值00000003-0000-0000-c000-000000000000或删除策略required-claims中的值validate-jwt以使其正常工作。

有什么想法吗?

Hur*_*hen 1

看来您选择了 OAuth2 授权的 v1 端点,但没有选择 v2 端点,因此aud访问令牌中的值应该类似于b7c31179-xxxx....但不是api://b7c31179-xxxx....。所以你获取访问令牌的步骤没有错误。

根据我这边的一些测试,这个问题的原因是你resource在APIM中配置OAuth2.0时没有指定带有backend-app应用程序id值的参数。您引用的 文档也提到了这一点(我测试时未指定此参数,它显示与您相同的问题)在此输入图像描述

因此,要解决此问题,请转到您的 APIM 并单击“ OAuth 2.0 ”选项卡,编辑您创建的项目。resource添加具有后端应用程序应用程序 ID 值的 参数。在此输入图像描述

注意:当您添加参数resource并单击“保存”按钮时,请再次打开该项目并检查“客户端密码”框是否为空。当我在我这边测试时,添加参数后“客户端密钥”框显示为空resource,这可能是该页面上的错误。如果“客户端密钥”为空,它可能会显示错误消息,就像The request body must contain the following parameter: 'client_assertion' or 'client_secret'您在开发者门户中获取访问令牌时一样。