【问题标题】:How to verify JWT provided by KeyCloak using .Net Core?如何使用 .Net Core 验证 KeyCloak 提供的 JWT?
【发布时间】:2021-05-17 04:05:35
【问题描述】:

我有一个 ASP.Net Core 5 资源服务器,我想验证我的访问令牌但尚未成功。

我写了一个中间件来更好地处理错误:

var token = context.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last();
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(_configuration["Jwt:Kid"]); // Kid is copied from 'openid-connect/certs'

tokenHandler.ValidateToken(token, new TokenValidationParameters
{
    ValidIssuer = _configuration["Jwt:Issuer"],
    IssuerSigningKey = new SymmetricSecurityKey(key),
    ValidateAudience = false,
    ValidateIssuer = true,
    ValidateIssuerSigningKey = true,
    ValidateLifetime = false
}, out SecurityToken validatedToken);

我的 KeyCloak 的钥匙在 */auth/realms/test/protocol/openid-connect/certs:

{
  "keys": [
    {
      "kid": "O9cbi7dzidpxZGLV2eXlTvIECoKDB_YbUN2m73rp8",
      "kty": "RSA",
      "alg": "RS256",
      "use": "sig",
      "n": "qMaFN3tmQ0TaGWaWcanebanGDgh_bz7RzlTbbkiGtY707x...hF40ofv1Fxoy7hBUEKARUqCgjltj5_0TtWn850Eqak41lpa-P_PNsGdwBf18mqBCT8pFbzs8DeRZaD1Q",
      "e": "AQAB",
      "x5c": [
        "MIIClzCCAX8CBgF3jSSr9TANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTIxMDIxMDE4MTAyNloXDTMxMDIxMDE4MTIwNlowDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZI...8tUe5h/7rg1+bHAGVbWg=="
      ],
      "x5t": "G5NYmhm8yEwqHtyLwygxGw89A",
      "x5t#S256": "nEnZWkJQyCG4czEJx04Nyszyzc3l8bsxZ3es2wDTw"
    }
  ]
}

发出请求时,我总是收到以下异常。

{"IDX10501:签名验证失败。无法匹配密钥:\nkid: 'System.String'。\n捕获的异常:\n 'System.Text.StringBuilder'。\ntoken: 'System.IdentityModel.Tokens.Jwt .JwtSecurityToken'。"}

知道我做错了什么吗?

【问题讨论】:

  • 您使用的密钥是否与 Realm Settings > Keys > Public Key 中指定的密钥相同?
  • 是的,我已经试过孩子了,公钥和证书密钥也一样。

标签: c# asp.net-core authentication jwt keycloak


【解决方案1】:

RSA 不是对称算法。所以不要使用SymmetricSecurityKey 作为签名密钥,而是使用JsonWebKey 来自动为您生成正确的密钥:

tokenHandler.ValidateToken(token, new TokenValidationParameters
{
    ValidIssuer = _configuration["Jwt:Issuer"],
    IssuerSigningKey = new JsonWebKey(jsonKeyString),
    ValidateAudience = false,
    ValidateIssuer = true,
    ValidateIssuerSigningKey = true,
    ValidateLifetime = false
}, out SecurityToken validatedToken);

jsonKeySting 是一个字符串变量,它将您的关键段保存在提到的 json 中

{
  "kid": "O9cbi7dzidpxZGLV2eXlTvIECoKDB_YbUN2m73rp8",
  "kty": "RSA",
  "alg": "RS256",
  "use": "sig",
  "n": "qMaFN3tmQ0TaGWaWcanebanGDgh_bz7RzlTbbkiGtY707x...hF40ofv1Fxoy7hBUEKARUqCgjltj5_0TtWn850Eqak41lpa-P_PNsGdwBf18mqBCT8pFbzs8DeRZaD1Q",
  "e": "AQAB",
  "x5c": [
    "MIIClzCCAX8CBgF3jSSr9TANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTIxMDIxMDE4MTAyNloXDTMxMDIxMDE4MTIwNlowDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZI...8tUe5h/7rg1+bHAGVbWg=="
  ],
  "x5t": "G5NYmhm8yEwqHtyLwygxGw89A",
  "x5t#S256": "nEnZWkJQyCG4czEJx04Nyszyzc3l8bsxZ3es2wDTw"
}

【讨论】:

    猜你喜欢
    • 2023-02-20
    • 2021-09-01
    • 2019-08-15
    • 2017-06-01
    • 2023-04-01
    • 2017-07-09
    • 2020-02-18
    • 2020-11-26
    • 2021-06-27
    相关资源
    最近更新 更多