【问题标题】:Does APIM forward same bearer token to backend API? | OAuth 2.0 and Azure AADAPIM 是否将相同的不记名令牌转发到后端 API? | OAuth 2.0 和 Azure AAD
【发布时间】:2021-03-12 12:45:25
【问题描述】:

根据 Microsoft 提供的以下文档,我已经注册了这两个应用程序,使用客户端凭据设置 OAuth 2.0 服务并添加了“validate-jwt”入站策略。我已经使用邮递员生成承载令牌并在使用令牌传递的 APIM 实例下调用我的后端 API 对其进行了测试。它工作正常。

https://docs.microsoft.com/en-us/azure/api-management/api-management-howto-protect-backend-with-aad

但除了 Apim,我还想保护我的后端 API 并将相同的令牌传递给后端 API。所以我在这里有一些问题-

  • APIM 会自动将相同的不记名令牌转发到后端 API,还是我们需要为其配置任何策略?
  • 如果是这样,我如何检查跟踪日志?另外,如何在后端 API 代码中授权相同的令牌?

这是我的“validate-jwt”政策 -

<inbound>
    <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/{AAD Tenant ID}/v2.0/.well-known/openid-configuration" />
        <audiences>
            <audience>{App Id of backend App}</audience>
        </audiences>
    </validate-jwt>
    <base />
</inbound>

请帮忙。

【问题讨论】:

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


    【解决方案1】:

    第一个问题:

    根据我这边的一些测试,APIM似乎可以将相同的承载令牌自动转发到后端api,而无需添加任何策略。

    我在 APIM 中创建了一个 api,用于在后端调用 microsoft graph api(list users)。测试运行 APIM api,它显示“401 Unauthorized”错误。然后我在 APIM api 的标头中提供不记名令牌进行测试,如下图所示:

    它运行成功并响应用户列表。所以不记名令牌可以自动转发到后端api。

    第二个问题:

    如果你想跟踪后端 api 的日志,我认为你可以在你的 api 的后端代码中进行。

    要验证后端 api 中的令牌,您可以在后端 api 代码中解码 jwt 令牌,然后检查令牌中声明的值(下面我提供了一个示例来解码 jwt 令牌并获取 iss 的值声明)

    using System;
    using System.Collections.Generic;
    using System.IdentityModel.Tokens.Jwt;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApp5
    {
        class Program
        {
            static void Main(string[] args)
            {
                var stream = "your access token";
                var handler = new JwtSecurityTokenHandler();
                var jsonToken = handler.ReadToken(stream);
                var tokenS = handler.ReadToken(stream) as JwtSecurityToken;
    
                var iss = tokenS.Claims.First(claim => claim.Type == "iss").Value;
                Console.WriteLine(iss);
                //Then check if "iss" matches the value you specified.
    
                Console.ReadLine();
            }
        }
    }
    
    

    【讨论】:

    • 嗨@Hury,谢谢你的回复。对于您的第一个答案,您如何确定是否从后端 API 或 APIM 验证令牌?我只是想检查您是否有任何跟踪日志,您可以在其中找到后端 API 请求中的相同令牌?
    • 嗨@Rahul我不知道在请求后端api时如何跟踪令牌。在我的测试中,承载令牌是我在测试之前为后端 api 生成的。当我调用 APIM api 时,我在请求的标头中添加了令牌,如果后端 api 未验证令牌,它将响应错误消息。目前,它响应用户列表成功,所以我认为令牌已经转发到后端api并被验证。
    • 嗨@Hury,谢谢你的回复。我也会试试的。
    • 嗨@Rahul 请问您是否解决了这个问题?
    猜你喜欢
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 2021-01-31
    • 2015-09-09
    • 2022-08-18
    相关资源
    最近更新 更多