APIM 是否将相同的不记名令牌转发到后端 API? | OAuth 2.0 和 Azure AAD
Does APIM forward same bearer token to backend API? | OAuth 2.0 and Azure AAD
根据 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>
请帮忙。
第一个问题:
根据我这边的一些测试,APIM 似乎可以将相同的不记名令牌自动转发到后端 api,而无需添加任何策略。
我在 APIM 中创建了一个 api 以在后端调用 Microsoft Graph api(列出用户)。测试 运行 APIM api,它显示“401 Unauthorized”错误。然后我在 APIM api 的 headers 中提供不记名令牌进行测试,如下图所示:
运行成功并响应用户列表。因此不记名令牌可以自动转发到后端api。
第二个问题:
如果您想跟踪后端 api 的日志,我认为您可以在 api.
的后端代码中执行此操作
要在你的后端api验证令牌,你可以在你的后端api代码中解码jwt令牌,然后检查令牌中claim的值(下面我提供了一个示例来解码jwt token 并获取 iss
claim)
的值
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();
}
}
}
根据 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>
请帮忙。
第一个问题:
根据我这边的一些测试,APIM 似乎可以将相同的不记名令牌自动转发到后端 api,而无需添加任何策略。
我在 APIM 中创建了一个 api 以在后端调用 Microsoft Graph api(列出用户)。测试 运行 APIM api,它显示“401 Unauthorized”错误。然后我在 APIM api 的 headers 中提供不记名令牌进行测试,如下图所示:
运行成功并响应用户列表。因此不记名令牌可以自动转发到后端api。
第二个问题:
如果您想跟踪后端 api 的日志,我认为您可以在 api.
的后端代码中执行此操作要在你的后端api验证令牌,你可以在你的后端api代码中解码jwt令牌,然后检查令牌中claim的值(下面我提供了一个示例来解码jwt token 并获取 iss
claim)
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();
}
}
}