2012-03-08 46 views
0

未经授权的文件下载我有一个自定义的文本框一个login.aspx页面输入用户名和密码,即没有提供正确的用户名和pwd后loginview
我给你这是用来浏览网站上其他网页sessionid停止在asp.net

现在要下载file (1234)我将用户重拨为~/download.aspx?fileid=1234,在此页面上查看会话ID并将用户发送到文件url,即~/file/1234.pdf
如果有人直接输入文件的URL,那么我无法阻止他。
普拉斯指导我如何做到这一点...

P.S. :我在web.config文件中阅读了关于authentication rule的文档,但不知道如何将用户标记为已验证的用户,他在登录时提供了正确的用户名和密码。 (我只是检查数据库的用户名和密码并重定向到主页)

回答

4

您的验证策略相当薄弱。您应该将您的站点的区域(即本例中的文件目录)与角色绑定并将用户分配给他们。

但是,为了解决更为直接的问题,只需禁用外部世界即可访问文件目录,并在它们击中~/download.aspx?fileid=1234时为其提供文件。你可以找到说明此位置:How to properly serve a PDF file

+0

这是正确的做法使用的代码。点击链接 – 2012-03-08 05:19:13

+0

限制任何访问的文件夹并使用download.aspx文件夹中的response.writefile。 – 2012-03-08 06:08:13

1

看看这个 - http://support.microsoft.com/kb/301240

查找点4该条下 - “代码中的事件处理程序,以便它验证用户凭证”,它解释了你如何设置身份验证cookie验证用户

码看后:

FormsAuthenticationTicket tkt; 
     string cookiestr; 
     HttpCookie ck; 
     tkt = new FormsAuthenticationTicket(1, txtUserName.Value, DateTime.Now, 
DateTime.Now.AddMinutes(30), chkPersistCookie.Checked, "your custom data"); 
     cookiestr = FormsAuthentication.Encrypt(tkt); 
     ck = new HttpCookie(FormsAuthentication.FormsCookieName, cookiestr); 
     if (chkPersistCookie.Checked) 
     ck.Expires=tkt.Expiration;  
      ck.Path = FormsAuthentication.FormsCookiePath; 
     Response.Cookies.Add(ck); 

你可以做的是:

1. Enable form authentication in web.config 
2. deny anonymous access to downloads folder 
3. When user authenticates, set authentication cookie and redirect user to download folder 
4. download folder now can only be accessed by logged in user and id 
1

下面是我在我的项目

void ServeFile(string fname, bool forceDownload) 
{ 
if(UserHasPermission(fname)) 
{ 
    DownloadFile(fname,forceDownload); 
} 
else 
{ 
    ShowMessage("You have no permission"); 
} 
} 

private void DownloadFile(string fname, bool forceDownload) 
{ 
    string path = MapPath(fname); 
    string name = Path.GetFileName(path); 
    string ext = Path.GetExtension(path); 
    string type = ""; 
    // set known types based on file extension 
    if (ext != null) 
    { 
    switch(ext.ToLower()) 
    { 
    case ".htm": 
    case ".html": 
     type = "text/HTML"; 
     break; 

    case ".txt": 
     type = "text/plain"; 
     break; 

    case ".doc": 
    case ".rtf": 
     type = "Application/msword"; 
     break; 
    case ".pdf": 
     type = "Application/pdf"; 
     break; 
    } 
    } 
    if (forceDownload) 
    { 
    Response.AppendHeader("content-disposition", 
     "attachment; filename=" + name); 
    } 
    if (type != "") 
    Response.ContentType = type; 
    Response.WriteFile(path); 
    Response.End();  
}