You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure API OAuth2认证异常:可获取令牌但令牌无效

Azure APIM OAuth2认证401问题排查与解决

问题背景

我在Azure API Management(APIM)中搭建了一个API,计划通过OAuth2实现认证保护,后端是本地部署的端点,Azure与企业网络通过ExpressRoute连接。按教程完成配置后,能成功获取令牌,但调用API时始终返回401未授权。

已完成的配置步骤

  1. 后端服务应用注册(「后端」应用)
    • Client ID:bcaa2716-xxxx-xxxx-xxxx-09eca63145d3
    • 暴露API,应用ID URL:api://bcaa2716-xxxx-xxxx-xxxx-09eca63145d3
    • 创建应用角色:Submit.ADT
  2. 客户端应用注册(「客户端」应用)
    • Client ID:1ee63a96-xxxx-xxxx-xxxx-d33a13cafdcc
    • 添加客户端密钥
    • 关联「后端」应用的Submit.ADT角色权限并完成管理员同意
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:14:52