使用System.IdentityModel.Tokens.Jwt验证在C#中生成的令牌

时间:2018-02-21 13:55:51

标签: javascript c# reactjs jwt

我在使用C#的web api中创建了这样的令牌。

 private const string Secret = "someSecretKey";

        public static string GenerateToken(AuthModel user, int expireMinutes = 20)
        {
            var symmetricKey = Convert.FromBase64String(Secret);
            var tokenHandler = new JwtSecurityTokenHandler();

            var now = DateTime.UtcNow;
            var tokenDescriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(new[]
                        {
                            new Claim(ClaimTypes.Name, user.Username),
                            new Claim(ClaimTypes.Role, ((Roles)user.RoleId).ToString()),
                            new Claim("guid",user.Guid)
                        }),

                Expires = now.AddMinutes(Convert.ToInt32(expireMinutes)),

                SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(symmetricKey), SecurityAlgorithms.HmacSha256Signature)
            };

            var stoken = tokenHandler.CreateToken(tokenDescriptor);
            var token = tokenHandler.WriteToken(stoken);

            return token;
        }

当我使用反应应用程序的API时,我获得令牌,但无法使用相同的密钥验证它。 我得到错误INVALID SIGNATURE。 我正在使用jsonwebtoken npm包,

   import jwt from 'jsonwebtoken';
jwt.verify(token, keys.jwtSecret, async (err) => { 
      if (err) {
        //console.log('Token expired at: ', err.expiredAt)
        console.log("error", err)
      }
      else {
        dispatch(login(token));
      }
    });

我从来没有击中dispatch(login(token))。我正在使用它来检查localStorage中保存的令牌是否仍然有效以保持用户登录。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。无法在secretKey jwt.verify(token,secretKey);中推送base64 encoding/decoding因为某些const secret = new Buffer("myTokeSecretString", "base64"); 算法而无法正常工作。我必须做的是首先从我的秘密中制作缓冲区,如:

secret

然后将verify传递给user song A 11 A 22 B 22 B 33 C 11 D 44 C 33 E 11 D 33 方法并且它可以正常工作。