【问题标题】:When is JWTSecurityTokenHandler.ValidateToken() actually valid?JWTSecurityTokenHandler.ValidateToken() 什么时候真正有效?
【发布时间】:2015-06-04 00:14:26
【问题描述】:

我正在尝试创建一个令牌验证方法,如果 JWT 令牌基于签名有效,则该方法返回 true。我不认为我真的需要验证令牌中的所有内容,但是在调用 ValidateToken() 之后,真正表示令牌有效的是什么?存在原则吗? out 引用的令牌包含某些值?不确定何时从此方法返回 true。

public bool ValidateToken(string tokenString)
{
    var validationParameters = new TokenValidationParameters()
    {
        ValidIssuer = "My Company",
        ValidAudience = ApplicationId,
        IssuerSigningKey = JsonWebTokenSecretKey
    };

    SecurityToken token = new JwtSecurityToken();
    var tokenHandler = new JwtSecurityTokenHandler();
    var principal = tokenHandler.ValidateToken(tokenString, validationParameters, out token);

    return principal != null;
}

【问题讨论】:

    标签: authentication asp.net-identity asp.net-web-api jwt json-web-token


    【解决方案1】:

    我手动检查所有声明值。我一直在寻找同一个问题的明确答案,但我唯一看到的是,如果出现问题,ValidateToken 函数会抛出异常,所以我首先将调用包装在 try-catch 中并从渔获。

    不过,这只是我验证令牌的“第一步”。之后,我做了一些繁重的工作来手动检查某些值。例如,我确保声明部分中的 unique_name 值实际上作为用户存在于我的数据库中,该用户尚未被停用,以及其他类似的专有系统内容。

        public static bool VerifyToken(string token)
        {
            var validationParameters = new TokenValidationParameters()
            {
                IssuerSigningToken = new BinarySecretSecurityToken(_key),
                ValidAudience = _audience,
                ValidIssuer = _issuer,
                ValidateLifetime = true,
                ValidateAudience = true,
                ValidateIssuer = true,
                ValidateIssuerSigningKey = true
            };
    
            var tokenHandler = new JwtSecurityTokenHandler();
            SecurityToken validatedToken = null;
            try
            {
                tokenHandler.ValidateToken(token, validationParameters, out validatedToken);
            }
            catch(SecurityTokenException)
            {
                return false; 
            }
            catch(Exception e)
            { 
                log(e.ToString()); //something else happened
                throw;
            }
            //... manual validations return false if anything untoward is discovered
            return validatedToken != null;
        }
    

    最后一行,return validatedToken != null,纯粹是我的迷信。我从来没有见过 validToken 为空。

    【讨论】:

    • 看源码,确实是这样:ValidateToken 会抛出无效的token。 github.com/AzureAD/…这是糟糕的设计;我们不应该对控制流使用异常。但是,这就是今天这个图书馆的状态。
    • 我必须在我的应用程序中做类似的事情来测试令牌的有效性,但我建议不要捕获任何异常并说令牌无效,而是建议这样做:catch(SecurityTokenException ex) { return false; } catch(Exception){ log("something else happened"); throw; } 这种方式如果 validate 函数实际上是引发错误的原因,它只会返回 false。如果出现其他问题,它不会告诉您您的令牌无效。
    • tkd_aj:谢谢你的好建议。我们应该始终尽可能明确地处理例外情况。我已更新我的答案以包含您的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 2012-05-28
    • 2015-10-10
    相关资源
    最近更新 更多