获取授权上下文

适用于:所有 API 管理层级

使用 get-authorization-context 策略获取凭据提供商的指定连接的授权上下文(预览版)(以前称为“授权”),该提供商是在 API 管理实例中配置的。

该策略使用连接从配置的凭据提供程序提取和存储授权和刷新令牌。

注意

按照策略声明中提供的顺序设置策略的元素和子元素。 详细了解如何设置或编辑 API 管理策略

策略语句

<get-authorization-context
    provider-id="credential provider id" 
    authorization-id="connection id" 
    context-variable-name="variable name" 
    identity-type="managed | jwt"
    identity="JWT bearer token"
    ignore-error="true | false" />

属性

属性 说明 需要 默认
provider-id 凭据提供程序资源标识符。 允许使用策略表达式。 空值
authorization-id 连接资源标识符。 允许使用策略表达式。 空值
context-variable-name 要接收 Authorization 对象的上下文变量的名称。 允许使用策略表达式。 空值
identity-type 要针对连接的访问策略检查的标识类型。
- managed:API 管理实例的系统分配托管标识。
- jwtidentity 特性中指定的 JWT 持有者令牌。

允许使用策略表达式。
managed
标识 要根据连接权限检查的 Microsoft Entra JWT 持有者令牌。 对于除 jwt 之外的 identity-type,忽略此项。

预期声明:
- audience:https://azure-api.cn/authorization-manager
- oid:权限对象 ID
- tid:权限租户 ID

允许使用策略表达式。
空值
ignore-error 布尔值。 如果获取授权上下文导致错误(例如,找不到授权资源或资源处于错误状态),请执行以下操作:
- true:为上下文变量赋值 null。
- false:返回 500

如果将值设置为 false,并且策略配置包含 on-error 部分,则错误在属性 context.LastError 中可用。

允许使用策略表达式。
false

授权对象

授权上下文变量接收类型为 Authorization 的对象。

class Authorization
{
    public string AccessToken { get; }
    public IReadOnlyDictionary<string, object> Claims { get; }
}
属性名称 说明
AccessToken 持有者访问令牌,用于为后端 HTTP 请求授权。
声明 从授权服务器的令牌响应 API 返回的声明(请参阅 RFC6749#section-5.1)。

使用情况

使用注意事项

  • 将连接的访问策略分配给服务主体时配置 identity-type=jwt。 JWT 仅支持 /.default 仅限应用的范围。

示例

取回令牌

<!-- Add to inbound policy. -->
<get-authorization-context 
    provider-id="github-01" 
    authorization-id="auth-01" 
    context-variable-name="auth-context" 
    identity-type="managed" 
    ignore-error="false" />
<!-- Return the token -->
<return-response>
    <set-status code="200" />
    <set-body template="none">@(((Authorization)context.Variables.GetValueOrDefault("auth-context"))?.AccessToken)</set-body>
</return-response>

使用动态设置属性取回令牌

<!-- Add to inbound policy. -->
<get-authorization-context 
  provider-id="@(context.Request.Url.Query.GetValueOrDefault("authorizationProviderId"))" 
  authorization-id="@(context.Request.Url.Query.GetValueOrDefault("authorizationId"))" context-variable-name="auth-context" 
  ignore-error="false" 
  identity-type="managed" />
<!-- Return the token -->
<return-response>
    <set-status code="200" />
    <set-body template="none">@(((Authorization)context.Variables.GetValueOrDefault("auth-context"))?.AccessToken)</set-body>
</return-response>

将令牌附加到后端调用

<!-- Add to inbound policy. -->
<get-authorization-context
    provider-id="github-01" 
    authorization-id="auth-01" 
    context-variable-name="auth-context" 
    identity-type="managed" 
    ignore-error="false" />
<!-- Attach the token to the backend call -->
<set-header name="Authorization" exists-action="override">
    <value>@("Bearer " + ((Authorization)context.Variables.GetValueOrDefault("auth-context"))?.AccessToken)</value>
</set-header>

从传入请求获取令牌并返回令牌

<!-- Add to inbound policy. -->
<get-authorization-context 
    provider-id="github-01" 
    authorization-id="auth-01" 
    context-variable-name="auth-context" 
    identity-type="jwt" 
    identity="@(context.Request.Headers["Authorization"][0].Replace("Bearer ", ""))"
    ignore-error="false" />
<!-- Return the token -->
<return-response>
    <set-status code="200" />
    <set-body template="none">@(((Authorization)context.Variables.GetValueOrDefault("auth-context"))?.AccessToken)</set-body>
</return-response>

后续步骤

有关使用策略的详细信息,请参阅: