jwt - 验证每个操作或所有操作的 JWT 策略
问题描述
我目前在 Azure APIM 中有一个包含多个操作的 API 设置。我在All Operations部分实施了 JWT Bearer 身份验证策略。
我现在需要做的是根据我的令牌中返回的范围来实现每个操作的授权部分。我已经查看了这个示例并了解了API Authorization Restriction该怎么做
但是,尝试在根所有操作上实施策略,然后在该策略中检查所请求的操作并编写代码以将正确的范围与操作相匹配,这是好还是坏的做法。
或者是否应该为每个操作复制/粘贴 JWT 策略,然后只有该操作授权逻辑存在。
提前致谢。
解决方案
因此,您可以在 Global、Product、API 和精细操作级别应用策略。
然后将这些策略一起评估,以形成针对您的请求的有效策略。
我最终做的是在所有操作
级别应用该validate-jwt
策略。这意味着对于我的 API 中的任何操作,我的令牌都将通过身份验证。
<policies>
<inbound>
<base />
<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Not authenticated, token invalid." output-token-variable-name="jwt">
<openid-config url="redacted" />
<audiences>
<audience>redacted</audience>
</audiences>
<issuers>
<issuer>redacted</issuer>
</issuers>
</validate-jwt>
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
然后,我通过使用choose when
策略检查 JWT 令牌中的范围参数,将策略添加到操作中以执行授权。您需要确保将其添加到<base/>
策略元素之后。
<policies>
<inbound>
<base />
<choose>
<when condition="@(!((Jwt)context.Variables["jwt"]).Claims.GetValueOrDefault("scope").Contains("read:user"))">
<return-response>
<set-status code="403" reason="Forbidden" />
</return-response>
</when>
</choose>
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
推荐阅读
- angular - 将数据从表单发送到同级别的另一个组件 -angular
- javascript - document.getCSSCanvasContext 是原生 javascript 函数吗?
- azure - Ansible:构建一个新的 hosts.yml 文件并运行一个新的剧本
- bash - 如何根据字段值连接 JQ 中的虚拟值,然后 CSV 聚合这些连接?
- c# - 为什么不能捕捉到这个异常?
- angular - 如何将匿名函数传递给 Angular 模板
- python-3.x - 是什么导致过多的重复字母?
- parsing - 使用 Babel 的基本解析流程不起作用
- bash - 如何重用 bats 单元测试
- ruby-on-rails - 当我有 belongs_to 关系但没有基础数据库列时,如何编写查找器?