微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在阅读以下文章,尝试通过 AzureAD 使用 OAuth2 保护 APIM API:Protect a web API backend in Azure API Management by using OAuth 2.0 authorization with Azure AD

AzureAPIM - OAuth2

AzureAD - 后端应用程序:

AzureAD - 客户端应用:

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

enter image description here

在开发人员门户中,AzureAD 的身份验证成功并返回令牌:

enter image description here

但是调用API授权失败:

enter image description here

在jwt.io中检查收到的token,发现"aud": "00000003-0000-0000-c000-000000000000"不是backend-app application 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",}

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

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

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

有什么想法吗?

解决方法

从你的错误报告来看,确实是401错误,即你的aud与你要调用的api不匹配,我用auth code flow给你做一个简单的演示:

首先暴露后端应用的api,并添加客户端应用。

enter image description here

接下来,在“API 权限”下,授予前端应用程序访问后端 api 的权限:

  • 在“API 权限”下点击“添加权限”,然后点击“我的 API”标签。
  • 找到您的后端应用程序并选择适当的范围。
  • 点击“添加权限”。
  • 为您的 API 授予管理员许可。

enter image description here

获取令牌:

enter image description here

解析token:

enter image description here

,

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

根据我这边的一些测试,这个问题的原因是你在 APIM 中配置 OAuth2.0 时没有指定参数 resource 和 backend-app application id 的值。您所指的 document 也提到了这一点(我测试时未指定此参数,它显示出与您相同的问题) enter image description here

因此,要解决此问题,请转到您的 APIM 并单击“OAuth 2.0”选项卡,编辑您创建的项目。添加具有后端应用程序 ID 值的参数 resourceenter image description here

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。