Расшифруйте токен носителя в Azure API Management, чтобы получить значения acr_values

Есть ли способ расшифровать токен-носитель в политике управления API, чтобы создать условие, что это acr_values, например арендатор.

Глядя на документацию 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>

Альтернативно что-то вроде примера здесь, но для настройки поддерживаемой службы:

http://devjourney.com/blog/2017/03/23/extract-jwt-claims-in-azure-api-management-policy/

Документация, которую я прочитал: https://docs.microsoft.com/en-us/azure/api-management/api-management-transformation-policies#example-4

https://docs.microsoft.com/en-us/azure/api-management/policies/authorize-request-based-on-jwt-claims?toc=api-management/toc.json#policy

Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
2
0
4 156
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Итак, я заставил его работать очень хакерским образом, вы можете установить значения расшифрованного токена в заголовке, а затем установить условия для этого заголовка.

<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>

var jwtoid = context.Request.Headers.GetValueOrDefault("Авторизация").A‌​sJwt(); вернуть jwtoid?.Claims.GetValueOrDefault("имя") ?? "нулевой"; Итак, если имя содержит значение, такое как «Jąhn», и оно содержит специальный символ .. Его ошибка .. есть мысли?

Manas Kumar 18.11.2021 13:46

Вы пробовали метод .AsJwt() (https://docs.microsoft.com/en-us/azure/api-management/api-management-policy-expressions#ContextVariables):

<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>

Также я не уверен, нужен ли он вам в качестве заголовка для внутреннего запроса, если не рассмотреть возможность использования политики set-variable.

Спасибо, я думаю, что это, вероятно, лучший способ сделать это.

Chris Sewell 22.05.2019 09:57

Прошло несколько лет с тех пор, как на этот вопрос был дан ответ, но поскольку я нашел менее подробное решение без фактического изменения заголовков запроса, я подумал, что было бы неплохо поделиться с другими:

<set-variable name = "tenant" value = "@{
        var authHeader = context.Request.Headers.GetValueOrDefault("Authorization", "");
        return authHeader.AsJwt()?.Claims.GetValueOrDefault("tenant", "");
}" />
...
<choose>
    <when condition = "@(context.Variables.GetValueOrDefault("tenant", "") == "your-tenant-id")">

Другие вопросы по теме

Похожие вопросы