使用 Azure 应用服务身份验证登录 Api 管理服务

时间:2021-01-18 14:11:08

标签: azure oauth-2.0 azure-active-directory azure-api-management azure-appservice

我能够设置 Azure Active Directory (aad) 来对运行 Angular 前端的应用服务的用户进行身份验证,现在我想通过仅允许此经过身份验证的用户向 Api 管理服务端点发送请求来保护后端.

因此,我关注了这篇文章 https://docs.microsoft.com/en-us/azure/api-management/api-management-howto-protect-backend-with-aad,但我面临两个主要问题:

  1. /.auth/me 端点仅返回 id_token,而不返回 access_token
  2. 当我尝试使用邮递员时,我不断获得无效的受众,但邮递员使用的受众看起来像 00000-00000...

这里是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> 

1 个答案:

答案 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://)。