使某个URL仅在48小时内有效

时间:2014-08-27 11:51:54

标签: c# asp.net

我需要使某个网址仅在48小时内有效,此链接在服务器上生成并通过电子邮件发送给客户。

我想做的是在服务器上嵌入编码时间戳。

  • 这个时间戳当然需要编码,我不希望我的客户端有解码功能。
  • 另一个想法是使用公钥加密,其中密钥是用户名

此方案的最佳做法是什么?

4 个答案:

答案 0 :(得分:8)

我会将链接存储在具有Id和截止日期的数据库中。当用户访问该链接时,我会交叉检查到期日期,看看它是否已过期。

答案 1 :(得分:2)

如果您想要像@ 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);

答案 2 :(得分:1)

您可以选择将其创建的链接和时间存储在数据库中。当用户请求链接时,将创建时间与当前时间进行比较,如果小于两天,则填写请求,否则显示一些错误消息并从数据库中删除链接:)

答案 3 :(得分:1)

Amazon S3的方式是使用到期和散列参数...

http://www.myurl.com/index.php?expire=1409140600&hash=3984cfabc

因此散列参数验证URL,expiry参数验证日期