ASP.NET临时文件下载链接

4
我想知道如何生成一个临时下载地址,让我的文件在有限的时间内可以被下载。我知道这不是最好的做法,根据http://www.devx.com/codemag/Article/34535/1954,可能使用HttpHandlers是更好的选择。
但我很好奇如何使用url重写来生成一个文件名,使用GUID或其他加密命名技术,并使其在有限的时间内可用。
如果有人能指出一篇好的文章,我将不胜感激。

你正在使用ASP.NET MVC吗? - Aliostad
1
在这种情况下使用URL重写会带来什么好处?为什么不能将GUID放在查询字符串中? - Yuriy Faktorovich
@Yuriy:我知道可以那样做。但我也想了解更多有关使用URL重写来动态生成地址的内容。 - Kamyar
2个回答

7
今日免费次数已满, 请开通会员/明日再来

这一切都与用于确保只有正确的人拥有文件的任何身份验证毫无关系 - 您可以与任何类型的登录系统并行使用它,或者您也可以将其公开但具有时间限制。


3
无论使用哪个版本的ASP.NET框架,我都会偏向于使用加密令牌来加密文件标识符(我假设您已经拥有)和日期时间,在服务器端解密并验证其时间戳。以下是一种简单的实现方式:
    public static string GetDownloadToken(int fileId)
    {
        byte[] idbytes = BitConverter.GetBytes(fileId); // 4 bytes 
        byte[] dateTimeBytes = BitConverter.GetBytes(DateTime.Now.ToBinary()); // 8 bytes
        byte[] buffer = new byte[16]; // minimum for an encryption block 
        string password = "password";

        byte[] passwordBytes = Encoding.ASCII.GetBytes(password);
        Array.Copy(idbytes, 0, buffer, 0, idbytes.Length);
        Array.Copy(dateTimeBytes, 0, buffer, idbytes.Length, dateTimeBytes.Length);
        byte[] encryptedBuffer = new byte[256]; 
        using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
        {
            int count = sha1.TransformBlock(buffer, 0, buffer.Length, encryptedBuffer, 0);
            return Convert.ToBase64String(encryptedBuffer, 0, count);
        }
    }

谢谢。你提供的代码非常有趣。但我仍然对我提到的动态URL重写的显式解决方案非常好奇。你能否也给我一些关于这个问题的启示呢? - Kamyar
2
@Kamyar。我本来想提醒你不需要一个处理程序,你只需要一个将内容类型设置为application/octet-stream的ASPX页面,并将字节写入响应即可。但是我看到你对Jon的回答很满意。我也是伊朗人,很高兴在这里见到同胞! - Aliostad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接