创建受保护的链接

时间:2010-03-29 03:12:16

标签: c# .net

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

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

内置代码或第三方库?

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

2 个答案:

答案 0 :(得分: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是包含处理程序的类,在命名空间Example。

在该类中,您需要实现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
    }
}

以这种方式进行操作意味着将向服务器发送每个请求,这可能不是您想要的。

答案 1 :(得分:0)

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

类似的东西:

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

让处理程序拦截请求并从磁盘中获取文件,如果?token querystring值正确,则将其传递给客户端将是一件小事。

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