我们希望使用 validate-jwt 策略保护 API 操作调用,但当我使用 required-claims 检查范围时遇到问题。
示例:我有一个令牌,其范围包括多个值,例如“xxx.READ xxx.WRITE yyy.READ yyy.WRITE ...”
对于特定操作,我想使用 validate-jwt 策略来检查令牌是否包含链接的范围,例如:
<required-claims>
<claim name="scp" match="any">
<value>xxx.READ</value>
</claim>
</required-claims>
但由于 scp 中的多个值,验证总是失败...我如何检查此声明?我是否必须先提取 scp 值,如果是,我该怎么做?
提前致谢
多值声明应表示为 JWT 令牌内的数组:
"scp": ["xxx.READ", "xxx.WRITE", "yyy.READ", "yyy.WRITE"]
您发布的策略配置完全支持这种情况。
但是,如果您将它们表示为单个字符串(“xxx.READ xxx.WRITE yyy.READ yyy.WRITE”),那么您必须使用手动表达式来验证此类令牌,大致如下:
<choose>
<when condition="@(context.Request.Headers.ContainsKey("Authorization"))">
<set-variable name="token" value="@(context.Request.Headers.GetValueOrDefault("Authorization", string.Empty).AsJwt())" />
<choose>
<when condition="@{
if (context.Variables["token"] == null) {
return false;
}
var scp = ((Jwt)context.Variables["token"]).Claims.GetValueOrDefault("scp", (string[])null);
if (scp == null || scp.Length == 0) {
return false;
}
return scp.Any(c => c.Contains("xxx.READ"));
}">
<return-response response-variable-name="existing response variable">
<set-status code="401" reason="Unauthorized" />
</return-response>
</when>
</choose>
</when>
<otherwise>
<return-response response-variable-name="existing response variable">
<set-status code="401" reason="Unauthorized" />
</return-response>
</otherwise>
</choose>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)