azure - 在 Api Management 的 validate-jwt 中验证 "scp"

标签 azure jwt azure-api-management

我正在尝试验证传入的 JWT token 是否具有范围“labresults.read”和“user_impersonation”。我执行了以下策略片段

<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Invalid JWT Token" require-signed-tokens="true">
    <openid-config url="(snip)" />
    <audiences>
        <audience>(snip)</audience>
    </audiences>
    <required-claims>
        <claim name="scp" match="all">
            <value>labresults.read</value>
            <value>user_impersonation</value>
        </claim>
    </required-claims>
</validate-jwt>

我传入一个看起来像的 token

{
  "iss": "(snip)",
  "exp": 1522334650,
  "nbf": 1522331050,
  "aud": "(snip)",
  "sub": "(snip)",
  "email": "(snip)",
  "name": "Scott Chamberlain",
  "scp": "labresults.read user_impersonation",
  "azp": "(snip)",
  "ver": "1.0",
  "iat": 1522331050
}

当我从开发者门户进行“尝试”时,查看跟踪错误报告

validate-jwt (648 ms){
    "message": "JWT Validation Failed: Claim value mismatch: scp=labresults.read.."
}

我是否被迫使用单一声明

<claim name="scp">
    <value>labresults.read user_impersonation</value>
</claim>

我真的不想这样做,因为我不想强制这个 api 的使用者知道这两个作用域将是唯一按特定顺序传入的东西。

我需要做什么才能以正确的方式验证范围?

最佳答案

在 MSDN 论坛上从 Microsoft 人员那里得到了答案。

I would suggest you to specify “separator” attribute in policy statement to validate the JWT token and see if it helps. For more information, you might refer this document: https://learn.microsoft.com/en-us/azure/api-management/api-management-access-restriction-policies#ValidateJWT.

Swikruti BoseMicrosoft-MSFT (MSFT CSG)

当我第一次查看文档时,我完全忽略了 seperator 属性。

关于azure - 在 Api Management 的 validate-jwt 中验证 "scp",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49558780/

相关文章:

visual-studio - 有什么方法可以使用 Visual Studio 运行 Azure PowerShell cmdlet?

azure - 通过 Azure API 管理网关从 AAD 获取 JWT-Token

Azure API 管理多区域部署和多个区域的后端服务

arrays - 尝试为 Azure ARM 模板创建动态依赖于数组

php - azure 队列服务php连接字符串

python - GAE 中的 worker 角色和 Web 角色对应

PHP:基于 JWT 的身份验证

oauth - JWT(Json Web token )受众 "aud"与 Client_Id - 有什么区别?

javascript - 使用客户端路由进行 Node 身份验证

c# - 我想使用授权级别来保护 azure 功能