我正在使用 Identity 项目开发 .Net WebApi,并且正在使用承载身份验证。我有两种类型的客户。移动和网络项目。他们需要有不同的令牌到期时间。我有不同的 API 用于移动和网络登录。
承载身份验证配置:
builder.Services
.AddOptions<BearerTokenOptions>(IdentityConstants.BearerScheme)
.Configure(options =>
{
options.BearerTokenExpiration = TimeSpan.FromHours(24);
});
例如,移动应用程序令牌应在 14 天后到期,Web 令牌应在 1 天后到期。但我只能给出一种方案选择。
我尝试更改控制器中的不记名令牌选项,但没有任何改变:
_bearerTokenOptions.CurrentValue.BearerTokenExpiration = TimeSpan.FromHours(1);
您可以通过创建两个不同的 JwtBearer 身份验证方案来实现此目的,每个方案都有自己的令牌过期时间。然后您可以根据客户端类型(移动或 Web)自定义令牌生命周期。
例如:
在Program.cs中配置jwt认证
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer("WebScheme", options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
// Your token validation parameters
};
options.Events = new JwtBearerEvents
{
OnTokenValidated = context =>
{
// Additional logic when token is validated
return Task.CompletedTask;
}
};
options.SaveToken = true;
})
.AddJwtBearer("MobileScheme", options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
// Your token validation parameters
};
options.Events = new JwtBearerEvents
{
OnTokenValidated = context =>
{
// Additional logic when token is validated
return Task.CompletedTask;
}
};
options.SaveToken = true;
});
然后配置更改时间的生成令牌方法
private string GenerateJwtToken(int expirationInDays)
{
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, "user_id"),
//...
};
var token = new JwtSecurityToken(
_configuration["Jwt:Issuer"],
_configuration["Jwt:Audience"],
claims,
expires: DateTime.Now.AddDays(expirationInDays), //difference here
signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);
}
针对不同的客户端调用此方法
[HttpPost("login-web")]
public IActionResult LoginWeb([FromBody] LoginModel model)
{
// Perform your user authentication here
var token = GenerateJwtToken(1); // 1 day for web
return Ok(new { Token = token });
}
[HttpPost("login-mobile")]
public IActionResult LoginMobile([FromBody] LoginModel model)
{
// Perform your user authentication here
var token = GenerateJwtToken(14); // 14 days for mobile
return Ok(new { Token = token });
}
您还可以尝试将包含客户端标识符(如 deviceid 或 ip)的 jwt 令牌存储在数据库中。