我按照这篇文章使用 OAuth 2.0 配置 API 管理,但是在 APIM 开发人员门户 - API 触发器中进行身份验证期间出现以下错误。
{“代码”:“未经授权”,“消息”:{“错误”:“invalid_client”,“error_description”:“AADSTS650052: 该应用程序正在尝试访问服务 'XXXXXXXX-1f80-4ded-a96a-XXXXXX'(oauth-backend-api) 您的 组织“65e4e06f-f263-4c1f-becb-90deb8c2d9ff”缺少服务 校长为.请联系您的 IT 管理员以查看配置 您的服务订阅或同意该应用程序,以便 创建所需的服务主体。跟踪 ID: 8e6c4fac-b3fd-460c-976b-91ccca094c00 相关 ID: a65c5507-da87-47ce-841a-de29985af0dc 时间戳: 2024-08-10 23:11:17Z","error_uri":"https://login.microsoftonline.com/error?code=650052","state":"e689f2d6-be48-1230-b0b7-2d790cb5589f"
策略配置如下
<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/XXXXXXX/v2.0/.well-known/openid-configuration" />
<required-claims>
<claim name="aud">
<value>XXXXXXXX-1f80-4ded-a96a-XXXXXX</value>
</claim>
</required-claims>
</validate-jwt>
解决 - 通过将 SPN 中的多租户更改为单租户
新错误: AADSTS700016:在目录“XXXXXXX”中找不到标识符为“XXXX-2ab2-XX-XX-XXX”的应用程序。如果应用程序尚未由租户管理员安装或未得到租户中任何用户的同意,则可能会发生这种情况。您可能已将身份验证请求发送给了错误的租户。
以下是当前的 API 权限
{“code”:“未经授权”,“message”:{“error”:“invalid_client”,“error_description”:“AADSTS650052:应用程序正在尝试访问服务'XXXXXXXX-1f80-4ded-a96a-XXXXXX'( oauth-backend-api),您的组织“65e4e06f-f263-4c1f-becb-90deb8c2d9ff”缺少服务主体,请联系您的 IT 管理员以查看您的服务订阅的配置或同意应用程序,以便创建所需的服务。主体。跟踪 ID:8e6c4fac-b3fd-460c-976b-91ccca094c00 关联 ID:a65c5507-da87-47ce-841a-de29985af0dc 时间戳:2024-08-10 23:11:17Z","error_uri":"https://login .microsoftonline.com/error?code=650052","state":"e689f2d6-be48-1230-b0b7-2d790cb5589f"
为了消除此错误,您需要在 oauth-backend-app 中添加 oauth-client-app 的客户端 ID,如下所示,并将这两个应用程序仅保留在多租户中。
我正在 apim 中使用给定的策略。
<policies>
<inbound>
<base />
<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/932********f6d/v2.0/.well-known/openid-configuration" />
<issuers>
<issuer>https://sts.windows.net/932********f6d/</issuer>
</issuers>
<required-claims>
<claim name="aud">
<value>3a31*********c0b</value>
</claim>
</required-claims>
</validate-jwt>
</inbound>
</policies>
然后发布开发者门户并进入下面的屏幕以获取不记名令牌并单击接受。
然后得到 200 OK 响应。