因为我不想重新发明轮子,所以我非常肯定已经有了一个解决方案:我想生成一个过期的密码(基于不同的密码,byte[]或任何其他密码).其 idea 是,客户端生成的密码仅在服务器上的特定时间内有效.因此,只要他们的时钟不太不同,他们就可以使用交替密码进行通信.听起来很像证书,所以肯定已经有了解决方案.
因为我不想重新发明轮子,所以我非常肯定已经有了一个解决方案:我想生成一个过期的密码(基于不同的密码,byte[]或任何其他密码).其 idea 是,客户端生成的密码仅在服务器上的特定时间内有效.因此,只要他们的时钟不太不同,他们就可以使用交替密码进行通信.听起来很像证书,所以肯定已经有了解决方案.
在我看来,你正在寻找一种token
%的方法.你可以判断JWT
,它有到期日期,可以很容易地在服务器端验证.
下面是一个小例子:
string GenerateToken()
{
var mySecret = "mySecretmySecretmySecret";
var mySecurityKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(mySecret));
var tokenHandler = new JwtSecurityTokenHandler();
var tokenDescriptor = new SecurityTokenDescriptor
{
NotBefore = DateTime.UtcNow.AddSeconds(-2),
Expires = DateTime.UtcNow.AddSeconds(2),
SigningCredentials = new SigningCredentials(mySecurityKey, Security算法rithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
bool ValidateCurrentToken(string token)
{
var mySecret = "mySecretmySecretmySecret";
var mySecurityKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(mySecret));
var tokenHandler = new JwtSecurityTokenHandler();
try
{
tokenHandler.ValidateToken(token, new TokenValidationParameters
{
ClockSkew = TimeSpan.Zero,
ValidateIssuerSigningKey = true,
ValidateIssuer = false,
ValidateAudience = false,
IssuerSigningKey = mySecurityKey
}, out SecurityToken validatedToken);
}
catch
{
return false;
}
return true;
}
请注意这里的ClockSkew = TimeSpan.Zero
.默认情况下,MS允许令牌最多不同5分钟.我们只想使用绝对令牌的到期时间.