.NET Core - JWT - SecurityTokenNoExpirationException

Oct 02 2020

ในบริบทของการที่หน้าเข้าสู่ระบบฉันพยายามที่จะสร้างJWT โทเค็นใน .NET หลัก

มิดเดิลแวร์มีข้อยกเว้น:

SecurityTokenNoExpirationException

ค่อนข้างแน่ใจว่าทุกอย่างเข้าที่

ฉันตาม : https://www.youtube.com/watch?edufilter=NULL&ab_channel=IAmTimCorey&v=9QU_y7-VsC8

นี่คือส่วนควบคุมการพิสูจน์ตัวตนที่สร้าง JWT:

var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(settings.JwtSecret);
var claims = new Claim[]
{
    new Claim(ClaimTypes.Name, user.Email),
    new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
    new Claim(ClaimTypes.Role, user.RoleId.ToString()),
    // token not valid before certain date, in our case, make it valid right away
    new Claim(JwtRegisteredClaimNames.Nbf, new DateTimeOffset(DateTime.Now).ToUnixTimeMilliseconds().ToString()),
    new Claim(JwtRegisteredClaimNames.Exp, new DateTimeOffset(DateTime.Now.AddMinutes(30)).ToUnixTimeMilliseconds().ToString()),
};

var header = new JwtHeader(
        new SigningCredentials(
            new SymmetricSecurityKey(key),
            SecurityAlgorithms.HmacSha256Signature
            )
        );

var payload = new JwtPayload(claims);

var securityToken = new JwtSecurityToken(header, payload);
var handler = new JwtSecurityTokenHandler();

นี่คือส่วน startup.cs ที่เตรียมใช้งานมิดเดิลแวร์ JWT:

var settings = settingsSection.Get<Settings>();
var key = Encoding.ASCII.GetBytes(settings.JwtSecret);
services.AddAuthentication(x =>
{
    x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
    x.RequireHttpsMetadata = false;
    x.SaveToken = true;
    x.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(key),
        ValidateIssuer = false,
        ValidateAudience = false
    };
});

บอกฉันหากคุณต้องการข้อมูลเพิ่มเติม

ขอบคุณที่ช่วยฉันในเรื่องนี้

คำตอบ

2 jps Oct 02 2020 at 15:38

การประทับเวลาใน JWT จะแสดงเป็นวินาทีในเวลาUNIX epochไม่ใช่มิลลิวินาที

RFC7519กำหนดวันที่เป็นตัวเลข:

ค่าตัวเลข JSON แทนจำนวนวินาทีตั้งแต่ 1970-01-01T00: 00: 00Z UTC จนถึงวันที่ / เวลา UTC ที่ระบุโดยไม่สนใจวินาทีอธิกสุรทิน

ดังนั้นใช้ToUnixTimeSeconds()แทนToUnixTimeMilliseconds()เมื่อคุณสร้างการอ้างสิทธิ์