C#如何通过代码生成在未来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

这里我有代码生成令牌有效期为24小时,但我正在寻找一个逻辑生成令牌号码将有效期为5分钟。我在谷歌上搜索,但没有找到答案。因此,请有人分享任何想法将不胜感激。谢谢

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()
方法,就完成了

榜样/小提琴
资源:

我正在寻找一个小型独立例程,它可以生成一个任意数,有效期最长可达5分钟。我不是真的在寻找identity.string token=DateTime.Now.AddMinutes(5.ToString();返回令牌;-?对不起,不是那么容易。如果我发现了逻辑,我会和你分享。我会检查你的代码并让你知道。谢谢你的回答。这行不清楚
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
}