JwtSecurityTokenHandler和TokenValidationParameters

24

我以前使用的是Microsoft.IdentityModel.Tokens.JWT的引用,一切工作正常。

我更新了新的System.IdentityModel.Tokens.Jwt,但现在似乎什么都不行了。它无法找到JwtSecurityTokenHandlerValidateToken方法,而且TokenValidationParameters没有AllowedAudienceSigningTokenValidateExpiration属性。

我错过了什么?有人能提供一个使用此功能进行JWT验证的工作示例吗?

我的“旧”代码:

private static void ValidateJwt(string jwt)
{
    var handler = new JWTSecurityTokenHandler();
    var validationParameters = new Microsoft.IdentityModel.Tokens.JWT.TokenValidationParameters()
    {
        AllowedAudience = "https://my-rp.com",
        //SigningToken = new BinarySecretSecurityToken(Convert.FromBase64String(myBase64Key)),
        SigningToken = new X509SecurityToken(
           X509
           .LocalMachine
           .My
           .Thumbprint
           .Find("UYTUYTVV99999999999YTYYTYTY88888888", false)
           .First()),
        ValidIssuer = "https://my-issuer.com/trust/issuer",
        ValidateExpiration = true
    };

    try
    {
        var principal = handler.ValidateToken(jwt, validationParameters);
    }
    catch (Exception e)
    {

        Console.WriteLine("{0}\n {1}", e.Message, e.StackTrace);
    }

    Console.WriteLine();
}
1个回答

45
经过大量的研究和测试,我终于发现了一些 TokenValidationParameters 属性名称已更改以及 JwtSecurityTokenHandler.ValidateToken() 方法签名也发生了变化。因此,这是以上代码的修改后的可行版本。
private static void ValidateJwt(string jwt)
{
    var handler = new JwtSecurityTokenHandler();   
    var validationParameters = new TokenValidationParameters()
    {
        ValidAudience = "https://my-rp.com",
        IssuerSigningTokens = new List<X509SecurityToken>() { new X509SecurityToken(
           X509
           .LocalMachine
           .My
           .Thumbprint
           .Find("UYTUYTVV99999999999YTYYTYTY88888888", false)
           .First()) },
        ValidIssuer = "https://my-issuer.com/trust/issuer",
        CertificateValidator = X509CertificateValidator.None,
        RequireExpirationTime = true
    };

    try
    {
        SecurityToken validatedToken;
        var principal = handler.ValidateToken(jwt, validationParameters, out validatedToken);
    }
    catch (Exception e)
    {

        Console.WriteLine("{0}\n {1}", e.Message, e.StackTrace);
    }

    Console.WriteLine();
}

供参考,JwtSecurityTokenHandler位于System.IdentityModel.Tokens命名空间中。别忘了添加包"Microsoft .Net Framework 4.5的JSON Web令牌处理程序"(在我编写此文时版本为4.0.0)。

希望这能节省一些时间供大家查询!


5
谢谢您!唉,太令人沮丧了:\ 与其他框架相比,在ASP.NET中编码绝对是一场噩梦。 - ossys
@ossys 也许只是 Azure 的部分问题?我已经使用 ASP.NET 有一段时间了,非常喜欢它。现在必须做 Azure AD 的东西,真是令人头疼。 - Shelby115
@Shelby115 很高兴你在使用ASP.NET方面运气更好了! :) 我认为对于RESTful开发,Node.js本地支持JSON格式,所以尝试管理C#对象和映射是很困难的...但对于这个JWT问题,它是API的一个变化,我找不到任何文档来解决它 :( - ossys
TokenValidationParameters的默认构造函数中,RequireExpirationTime被设置为true - bugged87
4
@ossys .NET的文档越来越差了。我很难在这些类中找到任何信息。太多的尝试和错误。 - Mark Dornian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接