我能够设置 Azure Active Directory (aad) 来对运行 Angular 前端的应用服务的用户进行身份验证,现在我想通过仅允许此经过身份验证的用户向 Api 管理服务端点发送请求来保护后端.
因此,我关注了这篇文章 https://docs.microsoft.com/en-us/azure/api-management/api-management-howto-protect-backend-with-aad,但我面临两个主要问题:
/.auth/me
端点仅返回 id_token
,而不返回 access_token
这里是api管理服务入站请求策略jwt-validate:
<policies>
<inbound>
<base />
<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="failed message">
<openid-config url="https://login.microsoftonline.com/{tenant-id}/.well-known/openid-configuration" />
<audiences>
<audience>{app-id-uri}></audience>
</audiences>
</validate-jwt>
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
答案 0 :(得分:0)
对于您的第一个问题:
实际上,它只能在您请求 /.auth/me
端点时响应 id 令牌,因为您只是实现了登录,但并未在您的应用服务中指定资源(或受 AD 保护的后端应用/api)。所以响应包含 id 令牌而没有访问令牌。
如果您想在请求 /.auth/me
端点时获取访问令牌,则需要在您的应用服务中指定资源。在这里,我假设您已经在 Azure AD 中registered 一个应用程序来表示您的 APIM。然后您可以使用 Resource Explore 修改如下设置:
1。找到您的应用服务
2。找到 config->authsettings(下面的 resource
是您注册代表 APIM 的应用的客户端 ID)
"additionalLoginParams": [
"response_type=code id_token",
"resource=3fa9607b-63cc-4050-82b7-91e44ff1df38"
],
3 .为 Azure 应用程序配置 redirect_uri,如下所示:
https://yourapp.azurewebsites.net/.auth/login/aad/callback
然后登录angular应用后,就可以通过端点获取access_token:
https://yourapp.azurewebsites.net/.auth/me
上面的步骤来自这个post,你也可以参考它的详细信息。
对于您的第二个问题:
当您在 postman 中请求 APIM api 时,您应该将访问令牌放在请求头中。您提到您在 postman 中使用的访问令牌包含类似 00000-00000...
的受众,但在您的 validate-jwt
政策中,您使用:
<audiences>
<audience>{app-id-uri}</audience>
</audiences>
看来 {app-id-uri}
不仅是一个 id,还应该是一个 uri,如:api://00000-00000...
。因此,请将 {app-id-uri}
从 uri 格式更改为 id 格式(只需删除 api://
)。