You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core MVC 6中JWT Decode抛出NullReferenceException问题

问题:JWT.Net Decode方法持续抛出NullReferenceException异常

我在ASP.NET Core MVC 6中基于JWT实现基础身份验证功能,登录后将Token存入Session,进入仪表盘时通过AJAX请求向控制器发送Token进行验证。目前遇到的问题是,即使硬编码Token,调用JWT.Net包的Decode函数仍持续抛出NullReferenceException异常。


相关代码

仪表盘AJAX代码

function checkToken() {
    //var token = sessionStorage.getItem("loginSession");
    var data = {
        token: sessionStorage.getItem("loginSession")
    };
    console.log(data)
    $.ajax({
        url: '/Auth/Validate',
        type: 'POST',
        contentType: "application/json",
        data: JSON.stringify(data),
        success: function (result) {
            console.log(result);
        }
    })
}

控制器代码

using JWT.Algorithms;
using JWT.Serializers;
using JWT;
using Microsoft.AspNetCore.Mvc;
using FrontEnd.ViewModel;
using NuGet.Common;

namespace FrontEnd.Controllers
{
    public class AuthController : Controller
    {
        public IActionResult Login()
        {
            return View();
        }

        public IActionResult Register()
        {
            return View();
        }
        public IActionResult Forgot()
        {
            return View();
        }
        [HttpPost]
        public string Validate([FromBody]AuthVM authVM)
        {
            //var token = authVM?.token;
            //if (string.IsNullOrEmpty(token))
            //{
            //    throw new ArgumentException("Token is null or empty");
            //}
            var token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImFzZEBlbWFpbC5jb20iLCJuYW1lIjoiTGFydWUgTW9ociJ9.l37wEV8ttLXBW5pMa8dMj7iAz6eWnaqiMbG93gpUOzA";

            IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
            IJsonSerializer serializer = new JsonNetSerializer();
            IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
            
            IDateTimeProvider provider = new UtcDateTimeProvider();
            IJwtValidator validator = new JwtValidator(serializer, provider);
            IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder, algorithm);

            var payload = decoder.Decode(token);

            return payload;
        }
    }
}

ViewModel代码

namespace FrontEnd.ViewModel
{
    public class AuthVM
    {
        public string token { get; set; }
    }
}

异常堆栈信息

System.NullReferenceException
  HResult=0x80004003
  Message=Object reference not set to an instance of an object.
  Source=JWT
  StackTrace:
   at JWT.JwtDecoder.<>c.<AllKeysHaveValues>b__20_0(Byte[] key)
   at System.Array.TrueForAll[T](T[] array, Predicate`1 match)
   at JWT.JwtDecoder.ValidSymmetricAlgorithm(Byte[][] keys, String decodedPayload, IJwtAlgorithm algorithm, Byte[] bytesToSign, Byte[] decodedSignature)
   at JWT.JwtDecoder.Validate(JwtParts jwt, Byte[][] keys)
   at JWT.JwtDecoder.Decode(JwtParts jwt, Byte[][] keys, Boolean verify)
   at FrontEnd.Controllers.AuthController.Validate(AuthVM authVM) in C:\Users\Redactedhehe\source\repos\UniversityAPI\FrontEnd\Controllers\AuthController.cs:line 54

问题原因及解决方法

从堆栈信息可以看出,异常出现在AllKeysHaveValues方法中,说明验证JWT签名时缺少必要的密钥。你使用的是HMACSHA256对称加密算法,解码时必须提供与签发Token时完全一致的密钥,否则无法完成签名验证,进而引发空引用异常。

修改方案

  1. 定义与签发端一致的密钥:
var secretKey = "你的实际密钥字符串"; // 替换为生成Token时使用的密钥
  1. 调用Decode方法时传入密钥:
var payload = decoder.Decode(token, secretKey, verify: true);

完整修改后的Validate方法:

[HttpPost]
public string Validate([FromBody]AuthVM authVM)
{
    var token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImFzZEBlbWFpbC5jb20iLCJuYW1lIjoiTGFydWUgTW9ociJ9.l37wEV8ttLXBW5pMa8dMj7iAz6eWnaqiMbG93gpUOzA";
    var secretKey = "你的实际密钥"; // 替换为签发Token的密钥

    IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
    IJsonSerializer serializer = new JsonNetSerializer();
    IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
    IDateTimeProvider provider = new UtcDateTimeProvider();
    IJwtValidator validator = new JwtValidator(serializer, provider);
    IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder, algorithm);

    var payload = decoder.Decode(token, secretKey, verify: true);

    return payload;
}

可选方案(不推荐生产环境使用)

如果仅需解码Payload而跳过签名验证,可以调用不带密钥的重载:

var payload = decoder.Decode(token, verify: false);

内容的提问来源于stack exchange,提问作者cherno304

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 02:34:54