jwt token 过期时间(asp.net core)
Posted
技术标签:
【中文标题】jwt token 过期时间(asp.net core)【英文标题】:jwt token expiration time (asp.net core) 【发布时间】:2018-12-22 09:25:25 【问题描述】:我想延长 JWT 令牌的生命周期,但我不能。
我尝试用谷歌搜索这件事,发现对JwtBearerOptions.TokenValidationParameters.ClockSkew
的引用。
我还尝试提供 1 分 20 秒的时间跨度,但应用并未考虑这些更改。
Startup.cs
:
services
.AddAuthentication(options =>
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
)
.AddJwtBearer(x =>
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters()
ClockSkew = TimeSpan.FromSeconds(20),
RequireExpirationTime = true,
RequireSignedTokens = true,
ValidateIssuerSigningKey = true,
ValidateLifetime = true,
IssuerSigningKey = Configuration.GetSymmetricSecurityKey(),
ValidAudience = Configuration.GetValidAudience(),
ValidIssuer = Configuration.GetValidIssuer()
;
);
这是Authenticate
操作:
[AllowAnonymous]
[HttpPost]
public async Task<AuthenticateOutput> Authenticate([FromBody] AuthenticateInput input)
string subdomain = Request.GetSubDomain();
var user = await _userService.Authenticate(input.UserName, input.Password, subdomain);
if (user == null)
throw new Exception("Unauthorised");
var tokenHandler = new JwtSecurityTokenHandler();
var tokenDescriptor = new SecurityTokenDescriptor
Issuer = _config.GetValidIssuer(),
Audience = _config.GetValidAudience(),
SigningCredentials = new SigningCredentials(_config.GetSymmetricSecurityKey(), SecurityAlgorithms.HmacSha256),
Subject = new ClaimsIdentity(new[]
new Claim(ClaimTypes.Name, user.UserName),
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString())
)
;
var token = tokenHandler.CreateToken(tokenDescriptor);
string tokenString = tokenHandler.WriteToken(token);
return new AuthenticateOutput() UserId = user.Id, Token = tokenString ;
我错过了什么吗?
【问题讨论】:
【参考方案1】:令牌描述符中未定义到期值。
var tokenDescriptor = new SecurityTokenDescriptor
Issuer = _config.GetValidIssuer(),
Audience = _config.GetValidAudience(),
SigningCredentials = new SigningCredentials(_config.GetSymmetricSecurityKey(), SecurityAlgorithms.HmacSha256),
Subject = new ClaimsIdentity(new[]
new Claim(ClaimTypes.Name, user.UserName),
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString())
),
// expiration time here...
Expiration = _config.GetExpiration() // etc
;
【讨论】:
【参考方案2】:Bayram 的回答中有一个错字,所以我想我应该发布我的。
SecurityTokenDescriptor
中不存在属性 Expiration
。我是DateTime? Expires
。
DateTime expires = input.RememberMe ? DateTime.UtcNow.AddDays(5) : DateTime.UtcNow.AddMinutes(20);
var tokenDescriptor = new SecurityTokenDescriptor
Expires = expires,
...
完美运行!
【讨论】:
【参考方案3】:var token = new JwtSecurityToken(_config["Jwt:Issuer"], _config["Jwt:Issuer"],
claims, expires: DateTime.Now.AddMinutes(120)
【讨论】:
以上是关于jwt token 过期时间(asp.net core)的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core 自动刷新JWT Token #yyds干货盘点#
ASP.NET Core Identity Server 3自定义修改Token过期刷新时间
如何注销或过期 ASP.NET Core Web API 的 JWT 令牌?
使用 Microsoft System.IdentityModel.Tokens.Jwt 在 Asp.net WebApi 中实现 JWT 身份验证
ASP.Net Core 3.0 JWT Bearer Token 没有 SecurityTokenValidator 可用