2010-03-29 79 views
3

有没有办法创建一个受保护的下载链接,该链接是随机的,过期的,需要密码并指向C#中与IIS 7.0关联的特定文件?创建受保护的链接

几个随机链接可以链接到同一个文件。

内置代码或可能是第三方库?

例如,http://www.example.com/<some random gibberish>/<md5 of file>/file.jpg

回答

2

一种方式做,这是使用的GUID。 GUID被设计为不会相互碰撞,并且该设计也会导致难以猜测有效的GUID。我确信有人会告诉我这不是很安全!那么,你也用密码保护。在C#中生成一个GUID非常容易。

我猜你需要的是首先采用这种方式摄取要保护的文件,其次是处理器将响应给定路径中的请求并检查路径中的GUID以确定它是有效。

然后,您需要一个数据库后端来维护与URL相对应的GUID列表,密码(最好是加密的)和到期日期。该处理程序将检查所请求的URL/GUID的条目以查看链接是否已过期,然后提示用户(可通过Web表单轻松完成此操作)密码,并根据存储在数据库中的加密密码进行检查。

要生成一个GUID,你想:

System.Guid.NewGuid().ToString() 

要创建一个名为模块(用于IIS7)每一个请求,然后才能将条目添加到您的web.config中像这样:

<modules> 
    <add name="MyDownloadModule" type="Example.MyDownloadModule, Example"/> 
</modules> 

其中MyDownloadModule是包含您的处理程序的类,位于名称空间示例中。

该类那么你需要实现IHttpModule接口内部,特别是重载方法:

public string ModuleName { 
    get { return "MyDownloadModule"; } 
} 

public void Init(HttpApplication app) { 
    // Add an event handle which is called at the beginning of each request 
    app.BeginRequest += new EventHandler(this.AppBeginRequest); 
} 

// 
// Our event handler for the BeginRequest event 
// 
private void AppBeginRequest(Object source, EventArgs e) 
{ 
    HttpRequest request = app.Context.Request; 

    // 
    // Is this a file download? 
    // 
    if (request.AppRelativeCurrentExecutionFilePath == "~/downloads") // or whatever 
    { 
      // this is where you work your GUID inspecting magic 
    } 
} 

走向看,这种方式意味着这将是呼吁向服务器发出请求,这可能不是你想要的。

0

您可以随时创建自己的HttpHandler,然后实现自己的专有过期/验证代码。

喜欢的东西:

http://www.example.com/download?token={your_token} 

然后,它将是一件微不足道的小事有处理器拦截请求,并抓住从磁盘上的文件,并将其交付给客户如果令牌查询字符串值是正确的?

有关IHttpHandler接口的详细信息,请参阅MSDN http://msdn.microsoft.com/en-us/library/system.web.ihttphandler.aspx