在 Azure API 管理中解密不记名令牌以获取 acr_values
Decrypt bearer token in Azure API Management to get 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/
好的,所以我让它以一种非常 hacky 的方式工作,您可以在 header 中设置解密令牌的值,然后在 header.
上设置条件
<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>
此外,我不确定您是否需要将其作为 header 后端请求,如果不需要,请考虑使用 set-variable 策略。
自从回答这个问题以来已经过去了几年,但当我发现一个不那么冗长的解决方案时,没有实际修改请求headers,我认为与其他人分享会很好:
<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")">
是否有任何方法可以解密 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/
好的,所以我让它以一种非常 hacky 的方式工作,您可以在 header 中设置解密令牌的值,然后在 header.
上设置条件<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>
此外,我不确定您是否需要将其作为 header 后端请求,如果不需要,请考虑使用 set-variable 策略。
自从回答这个问题以来已经过去了几年,但当我发现一个不那么冗长的解决方案时,没有实际修改请求headers,我认为与其他人分享会很好:
<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")">