首页 > 解决方案 > C# 或 VB 使用手动创建的 JWK 验证 JWT

问题描述

发疯,因为我得到“IDX10511:签名验证失败。密钥尝试...”当我尝试按照下面的验证。我已经尝试了一个直接的 JsonWebKey 并转换为 RSA 并产生相同的错误。在 javascript 中手动验证令牌和 JWK。:

Private Sub ValidateTokenAndSetIdentity(token As String)
    Dim TokenHandler As New JwtSecurityTokenHandler()
    Dim ValidationParameters As TokenValidationParameters = GetValidationParameters()
    Dim validToken As Microsoft.IdentityModel.Tokens.SecurityToken
    If TokenHandler.CanReadToken(token) Then
        Dim ValidKey As New JsonWebKeyConverter
        Dim Principal As ClaimsPrincipal = TokenHandler.ValidateToken(token, ValidationParameters, validToken)
        Thread.CurrentPrincipal = Principal
        HttpContext.Current.User = Principal
    End If
End Sub

Private Function GetValidationParameters() As TokenValidationParameters
    Dim SecurityKeys As List(Of Microsoft.IdentityModel.Tokens.SecurityKey) = GetSecurityKey()
    Dim TVP As New TokenValidationParameters With
        {
        .ClockSkew = TimeSpan.FromMinutes(5),
        .RequireSignedTokens = True,
        .RequireExpirationTime = True,
        .IssuerSigningKeys = SecurityKeys
    }
    Return TVP
End Function
Private Function GetSecurityKey() As List(Of Microsoft.IdentityModel.Tokens.SecurityKey)
    Dim Key As New JsonWebKey With {
    .Kid = "df255eb3e247cf83bac5a6227572f96e",
    .Kty = "RSA",
    .Alg = "RS256",
    .N = "LongValidStringHere",
    .E = "ShortValidString"
    }

    Dim Keys As New List(Of Microsoft.IdentityModel.Tokens.SecurityKey)
    Dim e As Byte() = Base64UrlEncoder.DecodeBytes(Key.E)
    Dim n = Base64UrlEncoder.DecodeBytes(Key.N)

    Dim FullKey As New Microsoft.IdentityModel.Tokens.RsaSecurityKey(New RSAParameters With {.Exponent = e, .Modulus = n}) With
        {
        .KeyId = Key.Kid
        }
    Keys.Add(FullKey)
    Return Keys
End Function

标签: .netjwtjwk

解决方案


aud就我而言,错误是由JWT 字段中的无效值引起的。确保它与有效受众相同。


推荐阅读