JWTSecurityTokenHandler.ValidateToken()何时实际有效?

Ada*_*dam 17 authentication jwt asp.net-web-api asp.net-identity json-web-token

我正在尝试创建一个令牌验证方法,如果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;
}
Run Code Online (Sandbox Code Playgroud)

Edd*_*lin 26

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

不过,这只是我在验证令牌时的"第一次通过".之后我做了一些更重的提升来手动检查某些值.例如,我确保声明部分中的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;
    }
Run Code Online (Sandbox Code Playgroud)

最后一行,return validatedToken != null纯粹是我的迷信.我从未见过validatedToken为null.

  • 看一下源代码,确实是这样的:ValidateToken会抛出无效的令牌.https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/master/src/System.IdentityModel.Tokens.Jwt/JwtSecurityTokenHandler.cs这是糟糕的设计; 我们不应该使用控制流的例外.但是,这就是今天这个图书馆的状态. (6认同)
  • 我必须在我的应用程序中做类似的事情来测试令牌有效性,但是我没有捕获任何异常并且说令牌无效,我建议做这样的事情:`catch(SecurityTokenException ex){return false; } catch(Exception){log("其他事情发生了"); 扔; 这样,如果validate函数实际上是错误的话,它只会返回false.如果其他因素中断,则不会告诉您令牌无效. (3认同)