C#使用授权端点crv,x,y中的值验证JWT令牌

问题描述

我在iframe的供应商网站上显示了一个网页。他们调用我的页面,并在查询字符串中传递JWT。我必须解析jwt。

eyJraWQiOiIyMDIwLTA5LTAyVDE3OjM2OjE3LjU3MC5lYyIsInR5cCI6IkpXVCIsImFsZyI6IkVTMjU2In0.eyJzdWIiOiJ1cm46Y2VybmVyOmlkZW50aXR5LWZlZGVyYXRpb246cmVhbG06SFdPb0lsUlgyWWRGZjkyNGJBZTZSR0l5WmtuajZrTjctY2g6cHJpbmNpcGFsOnRhNDh6OWdkNTVkNndyNW0iLCJhdWQiOiJodHRwczpcL1wvdXJsMjU4dmowai5leGVjdXRlLWFwaS51cy1lYXN0LTIuYW1hem9uYXdzLmNvbSIsImlzcyI6Imh0dHBzOlwvXC9kZXYuYmF5Y2FyZS5wYXRpZW50cG9ydGFsLnVzLTEuaGVhbHRoZWludGVudC5jb20iLCJleHAiOjE1OTkxNTQ1MTYsImlhdCI6MTU5OTE1MzkxNiwic2lkIjoiZGUwNmJhNmUtYjQyYy00ZmY5LWI4MmQtYmM4NjY0ODJmODU4In0.6Ru5Lyd1Zq016uv84pP-GjSuz6koVNipa_cd939eF21-5N2_A0Nj3I6AkDhuHrE870WzyTiCmZfkIjMOFZkRCA

我想通过从https://authorizion.x.com/jwk中提取值来验证签名。我得到的值看起来像这样:

{
   "keys":[
      {
         "kty":"EC","crv":"P-256","kid":"2020-09-04T18:16:04.934.ec","x":"82WEbXbnfGC1kmMfjJch6gFJRp7hEp08gzZQdBLLFIk","y":"ytkPwl4IjLw8M94DzgTmdAbxjq0AmmYu9mMmxpU3eBI"
      },{
         "kty":"EC","kid":"2020-09-02T17:36:17.570.ec","x":"uAfEPKELRuUVMtB0DCB5oyYWnfiV8-9zHYntvI0lsRE","y":"32J6nVgeb9RLdWK21QNDHhWdOsZJbxvyEq2n0IOvLtQ"
      },"kid":"2020-08-31T17:36:17.359.ec","x":"HsxFY2vihycZgYnkSTLDHJ0Cagr2nUcZTbf2yQKPS6A","y":"4kLClPGM0TG_gCUlBKkYdXrlLFVasPxQ2UOvwSBKyt0"
      }
   ]
}

我根据JWT标头中的kid值选择密钥。如何根据crv,x和y值验证签名?似乎我需要公共或私人证书,但我没有。

我还能添加什么。它使用ECDSA p-256加密。上面有一个Json Web令牌,在jwt.io上,我得到以下值,

标题

{
  "kid": "2020-09-02T17:36:17.570.ec","typ": "JWT","alg": "ES256"
}

有效载荷

{
  "sub": "urn:cerner:identity-federation:realm:HWOoIlRX2YdFf924bAe6RGIyZknj6kN7-ch:principal:ta48z9gd55d6wr5m","aud": "https://url258vj0j.execute-api.us-east-2.amazonaws.com","iss": "https://dev.baycare.patientportal.us-1.healtheintent.com","exp": 1599154516,"iat": 1599153916,"sid": "de06ba6e-b42c-4ff9-b82d-bc866482f858"
}

签名

6Ru5Lyd1Zq016uv84pP-GjSuz6koVNipa_cd939eF21-5N2_A0Nj3I6AkDhuHrE870WzyTiCmZfkIjMOFZkRCA

我包括了与JWT匹配的Java Web密钥集。

解决方法

这是一个基于Jose的简短解决方案。

基本上,您需要从给定的URL中读取JWKS,选择具有匹配密钥ID(kid)的正确JWK,并基于给定的Base64编码{{1 }}和ECJWKey参数,然后使用该密钥验证JWT:

以下源代码只是该过程的简短说明,并且密钥是硬编码的,不能从JWKS端点读取。

x

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...