如何解决使用 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
- 授权端点 URL (v1):https://login.microsoftonline.com/{tenant}/oauth2/authorize
- 令牌端点 URL (v1):https://login.microsoftonline.com/{tenant}/oauth2/token
- 客户端 ID:客户端应用 ID
- 重定向 URI:(已弃用的门户):https://xxx-api.portal.azure-api.net/docs/services/auth1/console/oauth2/authorizationcode/callback
AzureAD - 后端应用程序:
- 范围:文件。所有
AzureAD - 客户端应用:
- 秘钥:xxx
- 重定向网址:仅适用于 APIM (https://xxx-api.portal.azure-api.net/docs/services/auth1/console/oauth2/authorizationcode/callback) 中已弃用的门户
对于演示会议 API,将验证 JWT 策略添加到入站处理,其中 3a0cf09b-
是租户 ID,b7c31179-
是后端应用程序 ID:
在开发人员门户中,AzureAD 的身份验证成功并返回令牌:
但是调用API授权失败:
在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,并添加客户端应用。
接下来,在“API 权限”下,授予前端应用程序访问后端 api 的权限:
- 在“API 权限”下点击“添加权限”,然后点击“我的 API”标签。
- 找到您的后端应用程序并选择适当的范围。
- 点击“添加权限”。
- 为您的 API 授予管理员许可。
获取令牌:
解析token:
,您似乎选择了 OAuth2 授权的 v1 端点而不是 v2 端点,因此访问令牌中 aud
的值应该类似于 b7c31179-xxxx....
而不是 api://b7c31179-xxxx....
。所以你获取访问令牌的步骤没有错误。
根据我这边的一些测试,这个问题的原因是你在 APIM 中配置 OAuth2.0 时没有指定参数 resource
和 backend-app application id 的值。您所指的 document 也提到了这一点(我测试时未指定此参数,它显示出与您相同的问题)
因此,要解决此问题,请转到您的 APIM 并单击“OAuth 2.0”选项卡,编辑您创建的项目。添加具有后端应用程序 ID 值的参数 resource
。
注意:当您添加参数 resource
并单击“保存”按钮时,请再次打开该项目并检查“客户端密码”框是否是空的。当我在我身边测试时,添加参数resource
后“Client secret”框显示为空,可能是该页面上的错误。如果“客户端密钥”为空,则在开发者门户中获取访问令牌时,它可能会显示类似 The request body must contain the following parameter: 'client_assertion' or 'client_secret'
的错误消息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。