27

我正在尝试创建一个令牌验证方法,如果 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;
}
4

1 回答 1

42

我手动检查所有索赔值。我一直在寻找同一个问题的明确答案,但我唯一看到的是,如果出现问题,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 为空。

于 2015-04-16T22:01:05.133 回答