Есть ли способ расшифровать токен-носитель в политике управления 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


Итак, я заставил его работать очень хакерским образом, вы можете установить значения расшифрованного токена в заголовке, а затем установить условия для этого заголовка.
<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>
Вы пробовали метод .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.
Спасибо, я думаю, что это, вероятно, лучший способ сделать это.
Прошло несколько лет с тех пор, как на этот вопрос был дан ответ, но поскольку я нашел менее подробное решение без фактического изменения заголовков запроса, я подумал, что было бы неплохо поделиться с другими:
<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")">
var jwtoid = context.Request.Headers.GetValueOrDefault("Авторизация").AsJwt(); вернуть jwtoid?.Claims.GetValueOrDefault("имя") ?? "нулевой"; Итак, если имя содержит значение, такое как «Jąhn», и оно содержит специальный символ .. Его ошибка .. есть мысли?