Azure API 网关 - 将 JWT token 发送到后端

标签 azure azure-api-management

通过 Azure API 网关和外部 IdP (Okta),我们设置了一个简单且有效的设置。 API网关能够对JWT token 进行身份验证和授权并调用后端服务(App Logic或Azure函数)。

除了调用后端服务之外,API 网关还可以传递来自 JWT token 的声明

    <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="No JWT token" require-expiration-time="true" require-scheme="Bearer" require-signed-tokens="true" clock-skew="10" output-token-variable-name="jwttoken">

    <set-header name="jwt-token" exists-action="append">
        <value><![CDATA[@(context.Variables.ContainsKey("jwttoken") ? (((Jwt)(context.Variables["jwttoken"])).Subject) : "") ]]></value>
    </set-header>

后端服务 (AppLogic) 使用其 SAS token 进行授权,因此我们必须删除授权 header 。我正在考虑将 JWT token 发送到后端,但到目前为止我发现没有办法这样做(序列化 jwttoken 变量,API GW 不允许调用 .ToString() 方法)。

问:有/如何将原始 JWT token 发送到后端(在另一个 header 中?)

最佳答案

Jwt.TryParse 可用于分解 JWT token 并以明文形式传递到另一个 header :

<policies>
    <inbound>
        <base />
        <set-header name="parsed-token" exists-action="override">
            <value>@{
                string parsedToken = "error";
                string tokenHeader = context.Request.Headers.GetValueOrDefault("jwt-token", "");
                if (tokenHeader?.Length > 0)
                {
                    Jwt jwt;
                    if (tokenHeader.TryParseJwt(out jwt))
                    {
                        foreach(var claim in jwt.Claims)
                        {
                            parsedToken += claim.Key + ":" + string.Join("-",claim.Value) + ";";
                        }
                    }
                    }
                    return parsedToken;
                }</value>
        </set-header>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

对于来自 https://jwt.io/#debugger-io 的示例 token ,这将为您提供如下 header :

"jwt-token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c",
"parsed-token": "errorsub:1234567890;name:John Doe;iat:1516239022;",

I still cannot find proper documentation for class Jwt used in Azure API policy expressions - this class does not seem to have a ToString().

关于Azure API 网关 - 将 JWT token 发送到后端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64392067/

相关文章:

azure - 在本地运行 Azure 服务总线

azure - 如何使用 Terraform 在管理组范围上定义和分配 Azure 策略?

sql - 如何从 PIT Azure SQL 创建 bacPac 文件

azure - 部署到 Azure 时 Service Fabric 应用程序没有响应

azure - 将 SSL 证书绑定(bind)到 Azure 托管 API 中的特定终结点

asp.net-web-api - Azure api管理身份验证链接到Web api

Azure Rest API 配置详细信息

azure-api-management - API 管理基础认证

azure - 使用Postman测试Azure APIM Oauth 2.0生成jwt

authentication - 使用 user/pass 向 web.config 添加基本身份验证的最简单方法