Azure API OAuth2认证异常:可获取令牌但令牌无效
Azure APIM OAuth2认证401问题排查与解决
问题背景
我在Azure API Management(APIM)中搭建了一个API,计划通过OAuth2实现认证保护,后端是本地部署的端点,Azure与企业网络通过ExpressRoute连接。按教程完成配置后,能成功获取令牌,但调用API时始终返回401未授权。
已完成的配置步骤
- 后端服务应用注册(「后端」应用)
- Client ID:
bcaa2716-xxxx-xxxx-xxxx-09eca63145d3 - 暴露API,应用ID URL:
api://bcaa2716-xxxx-xxxx-xxxx-09eca63145d3 - 创建应用角色:
Submit.ADT
- Client ID:
- 客户端应用注册(「客户端」应用)
- Client ID:
1ee63a96-xxxx-xxxx-xxxx-d33a13cafdcc - 添加客户端密钥
- 关联「后端」应用的
Submit.ADT角色权限并完成管理员同意
- Client ID:
- APIM配置
- 创建API及对应操作
- 配置入站策略:
validate-jwt+mock-response(因本地后端未完成开发)
问题现象
通过Postman调用令牌端点能正常获取令牌,但使用该令牌调用APIM API时,返回401错误:Unauthorized. Access token is missing or invalid.
令牌请求参数
- Grant Type:
client_credentials - Client ID:
1ee63a96-xxxx-xxxx-xxxx-d33a13cafdcc - Client Secret:「客户端」应用注册的密钥
- Scope:
api://bcaa2716-xxxx-xxxx-xxxx-09eca63145d3/.default
关键配置与请求响应详情
APIM入站策略
<policies> <inbound> <base /> <!-- Look for authorization header bearer token and validate the token against the identity provider --> <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid."> <openid-config url="https://login.microsoftonline.com/{tenant-id}/v2.0/.well-known/openid-configuration" /> <required-claims> <claim name="aud"> <value>api://bcaa2716-xxxx-xxxx-xxxx-09eca63145d3</value> </claim> </required-claims> </validate-jwt> <mock-response status-code="200" content-type="application/json" /> </inbound> <backend> <base /> </backend> <outbound> <base /> </outbound> <on-error> <base /> </on-error> </policies>
令牌请求(完整)
POST https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token HTTP/1.1 Content-Type: application/x-www-form-urlencoded Host: login.microsoftonline.com Content-Length: 95 client_id=1ee63a96-xxxx-xxxx-xxxx-d33a13cafdcc&scope=api://bcaa2716-xxxx-xxxx-xxxx-09eca63145d3&client_secret={secret}&grant_type=client_credentials
令牌响应
HTTP/1.1 200 OK ... Content-Length: 1369 {"token_type":"Bearer","expires_in":3599,"ext_expires_in":3599,"access_token":"eyJ0eXAiOiJK...XwkpxaKpw"}
API请求
POST https://xxxxx-apim.azure-api.net/testoauth2/test HTTP/1.1 Ocp-Apim-Subscription-Key: 24b2xxxxxxxxxx3c192a03ca Authorization: Bearer eyJ0eXAiOiJK...XwkpxaKpw Content-Length: 0
API响应
HTTP/1.1 401 Unauthorized Content-Length: 85 Content-Type: application/json Request-Context: appId=cid-v1:af45326e-7707-4d17-af03-c890faa72200 Date: Fri, 09 Aug 2024 18:24:01 GMT { "statusCode": 401, "message": "Unauthorized. Access token is missing or invalid." }
问题排查与解决建议
1. 令牌Audience(aud)一致性验证
解码获取到的access_token(可使用jwt.ms工具),检查aud字段值是否与APIM策略中配置的api://bcaa2716-xxxx-xxxx-xxxx-09eca63145d3完全一致。
- 注意:Azure AD v2端点返回的令牌中,
aud可能会省略api://前缀,直接显示后端应用的Client ID。如果是这种情况,需将策略中的aud值改为bcaa2716-xxxx-xxxx-xxxx-09eca63145d3。
2. Scope参数修正
确认令牌请求中的Scope参数是否为api://bcaa2716-xxxx-xxxx-xxxx-09eca63145d3/.default(需包含.default后缀)。遗漏该后缀会导致令牌不包含应用角色权限,同时可能影响aud字段的正确性。
3. 应用角色权限验证
- 检查「客户端」应用的「API权限」页面,确认
Submit.ADT角色权限的状态为「已授予管理员同意」。 - 解码令牌后查看
roles字段,确认是否包含Submit.ADT,若没有则说明权限未正确授予。
4. APIM策略细节检查
- 替换
openid-config中的{tenant-id}占位符为实际租户ID。 - 若v2端点配置兼容性存在问题,可在
validate-jwt策略中显式指定签名密钥地址:<issuer-signing-keys> <discovery-keys url="https://login.microsoftonline.com/{tenant-id}/v2.0/discovery/v2.0/keys" /> </issuer-signing-keys>
5. 应用注册协作逻辑梳理
- 「后端」应用注册代表受保护的API资源,通过暴露API定义资源标识符和应用角色,实现访问权限管控。
- 「客户端」应用注册代表调用API的服务/应用,通过请求获取带有对应角色权限的令牌,证明自身有权访问「后端」资源。
- APIM的
validate-jwt策略负责验证令牌的合法性(签名、有效期、受众、权限等),确保只有有效请求能通过。
内容的提问来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

