Azure APIM:令牌验证失败时不返回错误的实现方法
如何让Validate-JWT策略验证失败时不返回错误并继续执行后续逻辑
问题描述
当前使用Validate-JWT策略验证令牌,配置代码如下:
<validate-jwt token-value="@((string)context.Variables["access_token"])" failed-validation-httpcode="401" failed-validation-error-message="Access token is invalid" output-token-variable-name="jwt-token"> <openid-config url="{{well-known-url}}" /> </validate-jwt>
希望令牌验证失败时不直接返回401错误,而是继续执行策略的其他分支(例如设置验证状态变量为false,后续通过<choose>分支处理),询问是否可行及实现方式。
可行方案:使用Try-Catch策略包裹Validate-JWT
Validate-JWT默认在验证失败时会终止请求并返回配置的错误响应,要避免这种行为,可以用<try>和<catch>策略块包裹Validate-JWT,捕获验证失败的错误后,自定义后续逻辑而不直接返回错误。
具体配置示例
<!-- 初始化验证状态变量为true --> <set-variable name="jwt_valid" value="@(true)" /> <try> <validate-jwt token-value="@((string)context.Variables["access_token"])" failed-validation-httpcode="401" failed-validation-error-message="Access token is invalid" output-token-variable-name="jwt-token"> <openid-config url="{{well-known-url}}" /> </validate-jwt> </try> <catch> <!-- 验证失败时将状态变量设为false --> <set-variable name="jwt_valid" value="@(false)" /> <!-- 可选:清除默认的错误响应,避免返回给客户端 --> <set-header name="Content-Type" exists-action="delete" /> <set-body>@("")</set-body> </catch> <!-- 后续用Choose分支根据验证状态处理逻辑 --> <choose> <when condition="@((bool)context.Variables["jwt_valid"])"> <!-- 验证通过时执行的逻辑 --> <set-variable name="auth_status" value="@("Authenticated")" /> </when> <otherwise> <!-- 验证失败时执行的逻辑 --> <set-variable name="auth_status" value="@("Unauthenticated")" /> <!-- 这里可以添加自定义处理,比如放行到特定后端或添加标识头 --> <set-header name="X-Auth-Status" exists-action="override"> <value>Unauthenticated</value> </set-header> </otherwise> </choose>
关键说明
<try>块中放置原Validate-JWT策略,验证成功时会正常执行后续逻辑,jwt_valid保持为true。<catch>块会捕获Validate-JWT抛出的验证错误,在这里将jwt_valid设为false,同时可以清除默认的错误响应内容,避免将401错误返回给客户端。- 后续通过
<choose>分支根据jwt_valid变量的值,分别处理验证通过和失败的逻辑,完全自定义后续流程。
内容的提问来源于stack exchange,提问作者tpschmidt
相关产品推荐
相关产品推荐

