C#如何通过代码生成在未来5分钟内有效的令牌
这里我有代码生成令牌有效期为24小时,但我正在寻找一个逻辑生成令牌号码将有效期为5分钟。我在谷歌上搜索,但没有找到答案。因此,请有人分享任何想法将不胜感激。谢谢C#如何通过代码生成在未来5分钟内有效的令牌,c#,C#,这里我有代码生成令牌有效期为24小时,但我正在寻找一个逻辑生成令牌号码将有效期为5分钟。我在谷歌上搜索,但没有找到答案。因此,请有人分享任何想法将不胜感激。谢谢 public static string GenerateToken() { int month = DateTime.Now.Month; int day = DateTime.Now.Day; string token = ((day * 100 + month) * 700 + day * 13).ToSt
public static string GenerateToken()
{
int month = DateTime.Now.Month;
int day = DateTime.Now.Day;
string token = ((day * 100 + month) * 700 + day * 13).ToString();
return token;
}
如果你使用身份。您可以实现这一点
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
...
public class SomeTokenAuthenticationService : IAuthenticateService
{
private readonly TokenManagement _tokenManagement;
public SomeTokenAuthenticationService(IOptions<TokenManagement> tokenManagement)
{
_tokenManagement = tokenManagement.Value;
}
public string GenerateToken(ClaimsIdentity identity){
var now = DateTime.UtcNow;
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_tokenManagement.Secret));
var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var jwtToken = new JwtSecurityToken(
_tokenManagement.Issuer,
_tokenManagement.Audience,
notBefore:now,
claims:identity.Claims,
expires: DateTime.Now.AddMinutes(_tokenManagement.AccessExpiration),
signingCredentials: credentials
);
var tokenjwt = new JwtSecurityTokenHandler().WriteToken(jwtToken);
return $"Bearer {tokenjwt}";
}}
这可能不是您想要的实现类型,但请看一看 摘录: 创建包含时间戳的唯一令牌的基本示例:
byte[] time = BitConverter.GetBytes(DateTime.UtcNow.ToBinary());
byte[] key = Guid.NewGuid().ToByteArray();
string token = Convert.ToBase64String(time.Concat(key).ToArray());
要解码令牌以获取创建时间,请执行以下操作:
byte[] tokenByteArray = Convert.FromBase64String(token);
DateTime when = DateTime.FromBinary(BitConverter.ToInt64(tokenByteArray, 0));
if (when < DateTime.UtcNow.AddMinutes(-5)) {
// too old
}
byte[]tokenByteArray=Convert.FromBase64String(令牌);
DateTime when=DateTime.FromBinary(BitConverter.ToInt64(tokenByteArray,0));
如果(当
(为了满足您对5分钟令牌失效的要求,我更改了解码部分,并为了清晰起见,将原始的“data”变量更改为“tokenByteArray”。)
回应评论请求的澄清 深入了解我们为什么使用
位转换器.ToInt64(tokenByteArray,0)
:
整个实现依赖于最终的反序列化操作,该操作允许我们重新生成最初的DateTime
对象的副本
此重建/反序列化通过调用静态DateTime.FromBinary()
方法完成,该方法将64位有符号整数(或long
数据类型)作为其参数
由于我们最初将DateTime
对象向下转换为byte[]
,因此我们需要反序列化生成的字符串
标记以提取DateTime
值。鉴于DateTime.FromBinary()
需要一个64位有符号整数参数,我们需要通过调用BitConverter.ToInt64(tokenByteArray,0)
-(0仅表示数组中开始转换的位置)来转换字符串令牌的字节[]
现在,我们只需将转换后的64位整数输入DateTime.FromBinary()
方法,就完成了
榜样/小提琴
DateTime.FromBinary(BitConverter.ToInt64(data,0))代码>请在您有时间时解释。当然-更新了我的答案,提供了更多详细信息和一个提琴示例。谢谢您的澄清。如何验证此令牌?这一次检查逻辑不工作<代码>如果(当
byte[] tokenByteArray = Convert.FromBase64String(token);
DateTime when = DateTime.FromBinary(BitConverter.ToInt64(tokenByteArray, 0));
if (when < DateTime.UtcNow.AddMinutes(-5)) {
// too old
}