C# .NET核心-JWT-SecurityTokenNoExpirationException
在登录页面的上下文中,我尝试在.NETCore中构建一个Jwt令牌 中间件正在引发异常: SecurityTokenNoExpirationException异常 很确定一切都准备好了 我接着说: 以下是创建JWT的身份验证控制器部分:C# .NET核心-JWT-SecurityTokenNoExpirationException,c#,asp.net-core,exception,jwt,C#,Asp.net Core,Exception,Jwt,在登录页面的上下文中,我尝试在.NETCore中构建一个Jwt令牌 中间件正在引发异常: SecurityTokenNoExpirationException异常 很确定一切都准备好了 我接着说: 以下是创建JWT的身份验证控制器部分: var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes(settings.JwtSecret); var claims = new Claim[] {
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();
下面是初始化JWT中间件的startup.cs部分:
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
};
});
var settings=settingsSection.Get();
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=新的TokenValidationParameters
{
ValidateSuersigningKey=true,
IssuerSigningKey=新对称性安全密钥(密钥),
validateisuer=false,
ValidateAudience=false
};
});
如果你需要更多信息,请告诉我
感谢您在这方面的帮助。JWT中的时间戳表示为秒,而不是毫秒 定义数字日期: JSON数值,表示从UTC 1970-01-01T00:00:00Z到指定UTC日期/时间的秒数,忽略闰秒
因此,在创建声明时,请使用
ToUnixTimeSeconds()
而不是ToUnixTimeSeconds()
。我会检查它,但我意识到承载器没有被发送。。。我贴了一个有棱角的问题。。。我不能帮你回答这个问题,但我想知道为什么你没有发送令牌,却得到了这样一个特殊的例外?但是无论如何,一旦你发送令牌,你就会发现,错误的时间戳格式是下一个问题。我想你也应该在TokenValidationParameters
中添加ValidateLifetime=true
,我会验证你的答案