Мне нужно сделать определенный URL действительным только в течение 48 часов. Эта ссылка создается на сервере и отправляется клиенту по электронной почте.
То, что я думал делать, - это встраивание на сервер закодированной метки времени.
Каковы наилучшие методы для этого сценария?
Я бы сохранил ссылку в базе данных с идентификатором и датой истечения срока действия. Когда пользователь посещает ссылку, я перейду к проверке даты истечения срока действия и посмотрю, истекло ли это.
Если вы хотите реализовать свой чек, например @craig1231, предложили, кто использует вашу идею, чтобы "закодировать" временную метку, вы можете использовать такой код:
private const string SECRET = "secret of your choice";
private string getSHA1Hash(string strToHash)
{
System.Security.Cryptography.SHA1CryptoServiceProvider sha1Obj = new System.Security.Cryptography.SHA1CryptoServiceProvider();
byte[] bytesToHash = System.Text.Encoding.Default.GetBytes(strToHash);
bytesToHash = sha1Obj.ComputeHash(bytesToHash);
string strResult = "";
foreach (byte b in bytesToHash)
{
strResult += b.ToString("x2");
}
return strResult.ToLower();
}
public bool IsValidRequest(long expiryTicks, string hash)
{
var expiried = new DateTime(expiryTicks);
var toHash = expiryTicks + SECRET;
if (expiried < DateTime.Now)
return false;
if (hash.ToLower() == getSHA1Hash(toHash))
return true;
return false;
}
public string GetHashForExpiryTicks(long expiryTicks)
{
var toHash = expiryTicks + SECRET;
return getSHA1Hash(toHash);
}
Чтобы создать ссылку, вы можете получить свой параметр хеширования следующим образом:
var hash = GetHashForExpiryTicks(DateTime.Now.AddHours(48).Ticks);
IsValidRequest(????, ????
Способ использования Amazon S3 состоит в том, чтобы иметь истечение и хешированный параметр...
http://www.myurl.com/index.php?expire=1409140600&hash=3984cfabc
Таким образом, хешированный параметр проверяет URL-адрес, а параметр expiry проверяет дату
у вас есть возможность сохранить ссылку и время ее создания в базе данных. когда пользователь запрашивает эту ссылку, сравнивает время создания с текущим временем и, если он меньше двух дней, тогда заполните заполнение запроса, иначе покажите сообщение об ошибке и удалите ссылку из базы данных :)