【Azure API 管理】在 Azure API 管理中使用 OAuth 2.0 授权和 Azure AD 保护 Web API 后端,在请求中携带Token访问后报401的错误
问题描述
配置 JWT 验证策略,对请求进行预授权”。 当在API中配置JWT Policy时,如以下内容:
<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.partner.microsoftonline.cn/{aad-tenant}/.well-known/openid-configuration" /> <required-claims> <claim name="aud"> <value>xxxxxxxx-xxxx-xxxx-xxxx-d322750988cb</value> </claim> </required-claims> </validate-jwt>
其中虽然携带了正确的Authorization Token,但是依旧还是会遇见 “IDX10205: Issuer validation failed. Issuer: 'https://sts.chinacloudapi.cn/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/'. Did not match: validationParameters.ValidIssuer: '' or validationParameters.ValidIssuers: 'https://login.partner.microsoftonline.cn/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0'." 错误。
问题原因
报错信息最可能的原因是policy中openid-config url填写错误。<openid-config url="https://login.partner.microsoftonline.cn/{aad-tenant}/.well-known/openid-configuration" /> 的值与JWT Token中的值步一致而引起的验证失败。 解析Token的值可以使用在线工具:https://jwt.io/. 如:
通过解析Token值后,对比错误消息。找出是否不一致的问题。可以在AAD中修改,也可以在API的Policy中修改。
附录:配置OAuth 2.0 的三个重要步骤
一:在 Azure AD 中授予权限
注册了用于表示 API 和开发人员控制台的两个应用程序之后,请授予权限以允许客户端应用调用后端应用。
搜索并选择“应用注册”。
然后,在应用的页面列表中,选择“API 权限”。
选择“添加权限”。
在“选择 API”下,选择“我的 API”,然后找到并选择你的 backend-app。
在“委托的权限”下,选择对 backend-app 的适当权限,然后选择“添加权限”。
(可选)在“API 权限”页上,选择“授予对 <your-tenant-name> 的管理员许可”,为此目录中的所有用户授予许可。
二:在开发人员门户中启用 OAuth 2.0 用户授权
此时,我们已在 Azure AD 中创建应用程序,并已授予适当的权限来让客户端应用调用后端应用。
以下步骤说明如何在开发人员门户中启用 OAuth 2.0 用户授权
在 Azure 门户中,浏览找到你的 API 管理实例。
选择“OAuth 2.0” > “添加”。
提供“显示名称”和“说明”。
在此示例中,用户不创建和配置自己的帐户,因此使用了占位符。
选择“授权代码”作为“授权类型”。
再次浏览到“应用注册”页,并选择“终结点”。
选择“授权”请求方法下的“POST”。
复制“OAuth 2.0 令牌终结点”,并将其粘贴到“令牌终结点 URL”文本框。
重要
我们建议使用 v2 终结点。
使用后端应用的“应用程序 ID”作为此参数的值。
accessTokenAcceptedVersion
属性的值设置为2
。这些是 client-app 的凭据。
对于“客户端 ID”,请使用客户端应用的“应用程序 ID”。
对于“客户端机密”,请使用前面为 client-app 创建的密钥。
记下此 URL。
选择“创建” 。
返回到 Azure Active Directory 中的客户端应用注册,并选择“身份验证”。
在“平台配置”下,单击“添加平台”,然后选择“Web”作为类型,将“redirect_url”粘贴在“重定向 URI”下,然后单击“配置”按钮进行保存。
配置 OAuth 2.0 授权服务器后,开发人员控制台可从 Azure AD 获取访问令牌。
这使得开发人员控制台知道在调用 API 之前,需要代表用户获取访问令牌。
浏览到 API 管理实例,并转到“API”。
例如,
Echo API
。转到“设置”。
在“安全性”下,选择“OAuth 2.0”并选择前面配置的 OAuth 2.0 服务器。
选择“保存” 。
三: 配置 JWT 验证策略,对请求进行预授权
开发人员控制台将代表用户获取访问令牌,并在对 API 发出的请求中包含该令牌。
它只是将
Authorization
标头传递给后端 API。设置或编辑策略。
<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.partner.microsoftonline.cn/{aad-tenant}/.well-known/openid-configuration" /> <required-claims> <claim name="aud"> <value>{Application ID of backend-app}</value> </claim> </required-claims> </validate-jwt>
备注
对于 v2
openid-config
终结点,请使用以下 URL:
https://login.partner.microsoftonline.cn/common/v2.0/.well-known/openid-configuration
.
参考文档
https://docs.azure.cn/zh-cn/api-management/api-management-howto-protect-backend-with-aad