【问题标题】:JwtSecurityTokenHandler and TokenValidationParametersJwtSecurityTokenHandler 和 TokenValidationParameters
【发布时间】:2014-10-30 20:59:38
【问题描述】:

我曾经引用过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();
}

【问题讨论】:

    标签: c# validation security jwt identity


    【解决方案1】:

    经过大量的研究和测试,我终于发现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 命名空间中。不要忘记添加包“JSON Web Token Handler For the Microsoft .Net Framework 4.5”(我写这些行时的版本 4.0.0)。

    希望它可以为你们中的一些人节省几个小时的搜索时间!

    【讨论】:

    • 谢谢!啊,太令人沮丧了:\ 与其他框架相比,在 ASP.NET 中编码绝对是一场噩梦
    • @ossys 也许只是 Azure 部分?使用 ASP.NET 有一段时间了,很喜欢它。现在必须做 Azure AD 的事情,这很痛苦。
    • @Shelby115 很高兴您在 ASP.NET 上获得了更好的运气! :) 我认为对于 RESTful 开发 Node.js 本身就支持 JSON 格式,因此尝试管理 C# 对象和映射很困难......但是对于这个 JWT 问题,它是对 API 的更改,没有我可以找到的文档:(
    • RequireExpirationTimeTokenValidationParameters 的默认构造函数中设置为true
    • @ossys .NET 文档已经走下坡路。我发现很难找到有关这些课程的任何信息。太多的尝试和错误。
    猜你喜欢
    • 2022-01-26
    • 2021-01-15
    • 2017-06-28
    • 2014-08-24
    • 2018-05-20
    • 2018-05-01
    • 2014-10-24
    • 2017-03-30
    • 2013-08-04
    相关资源
    最近更新 更多