在Azure API管理中解密承载令牌以获取acr_值

在Azure API管理中解密承载令牌以获取acr_值,azure,https,azure-api-management,bearer-token,Azure,Https,Azure Api Management,Bearer Token,有没有办法在API管理策略中解密承载令牌以创建其acr_值的条件,例如租户 查看MS文档,这似乎是不可能的,我希望实现以下目标: <when condition="@(context.Request.Headers["Authorization"] --DO MAGIC HERE-- .acr_values["tenant"] == "contoso" "> <set-backend-service base-url="http://co

有没有办法在API管理策略中解密承载令牌以创建其acr_值的条件,例如租户

查看MS文档,这似乎是不可能的,我希望实现以下目标:

        <when condition="@(context.Request.Headers["Authorization"] --DO MAGIC HERE-- .acr_values["tenant"] == "contoso" ">
            <set-backend-service base-url="http://contoso.com/api/8.2/" />
        </when>

或者,类似于这里的示例,但用于设置备份服务:

我读过的文档:


好的,我用一种非常粗糙的方式让它工作,你可以在报头中设置解密令牌的值,然后在报头上设置条件

<policies>
<inbound>
    <base />
    <set-header name="tenant" exists-action="append">
        <value>@{
            string tenant = "unknown";
            string authHeader = context.Request.Headers.GetValueOrDefault("Authorization", "");
            if (authHeader?.Length > 0)
            {
                string[] authHeaderParts = authHeader.Split(' ');
                if (authHeaderParts?.Length == 2 && authHeaderParts[0].Equals("Bearer", StringComparison.InvariantCultureIgnoreCase))
                {
                    Jwt jwt;
                    if (authHeaderParts[1].TryParseJwt(out jwt))
                    {
                        tenant = (jwt.Claims.GetValueOrDefault("tenant", "unknown"));
                    }
                }
            }
            return tenant;
            }</value>
    </set-header>
    <choose>
        <when condition="@(context.Request.Headers.GetValueOrDefault("tenant", "unknown") == "some-tenant" )">
            <set-backend-service base-url="http://contoso.com/api/8.2/" />
        </when>
    </choose>
</inbound>
<backend>
    <base />
</backend>
<outbound>
    <base />
</outbound>
<on-error>
    <base />
</on-error>

@{
字符串tenant=“未知”;
字符串authHeader=context.Request.Headers.GetValueOrDefault(“授权”);
如果(authHeader?.Length>0)
{
字符串[]authHeaderParts=authHeader.Split(“”);
if(authHeaderParts?.Length==2&&authHeaderParts[0]。等于(“承载者”,StringComparison.InvariantCultureInogoreCase))
{
Jwt-Jwt;
if(authHeaderParts[1].TryParseJwt(out jwt))
{
租户=(jwt.Claims.getValuerDefault(“租户”,“未知”);
}
}
}
归还承租人;
}

是否尝试过。AsJwt()方法():


@{
var jwt=context.Request.Headers.GetValueOrDefault(“授权”).AsJwt();
返回jwt?.Claims.GetValueOrDefault(“租户”)??“未知”;
}

我也不确定您是否需要它作为后端请求的头,如果不考虑使用set变量策略。

谢谢,我认为这可能是最好的方法。
<policies>
<inbound>
    <base />
    <set-header name="tenant" exists-action="append">
        <value>@{
            var jwt = context.Request.Headers.GetValueOrDefault("Authorization").AsJwt();
            return jwt?.Claims.GetValueOrDefault("tenant") ?? "unknown";
        }</value>
    </set-header>
    <choose>
        <when condition="@(context.Request.Headers.GetValueOrDefault("tenant", "unknown") == "some-tenant" )">
            <set-backend-service base-url="http://contoso.com/api/8.2/" />
        </when>
    </choose>
</inbound>
<backend>
    <base />
</backend>
<outbound>
    <base />
</outbound>
<on-error>
    <base />
</on-error>