2012-04-02 2 views
3

Ich habe den folgenden Fall, und ich möchte fragen, was die beste Lösung ist?Wie sichere ich einen Link, der nur von bestimmten Benutzern heruntergeladen werden kann?

Ich habe eine bestimmte Datei Ich möchte bestimmte Benutzer (nach einigen Berechtigungen) diese Datei herunterladen.

also zeige ich diese Datei nur für die autorisierten Benutzer, aber was ist, wenn jemand (nicht autorisiert) den Dateilink erkennt (kennt den Link url) und lade ihn herunter !!

Wie kann diese Datei nur von der authorized users heruntergeladen werden.

+1

IIS, Apache? Mit welchem ​​Webserver arbeiten Sie? – Shai

+0

Haben Sie versucht, das heruntergeladene Tag in einem nicht autorisierten Fall zu rendern? – Pankaj

+0

IIS, ich beabsichtige, die Datei in einen Ordner in meiner Webanwendung zu setzen –

Antwort

3

Legen Sie die Datei in ein Verzeichnis, das nicht vom Webserver bedient wird, und implementieren Sie einen Handler für die "virtuelle URL", der wiederum nach Berechtigungen etc. sucht - ein möglicher Weg wäre ein ASHX-Handler (siehe Beispiel here) Code und here für MSDN-Referenz).

+0

Könntest du mehr erklären, was du mit 'Put the Datei in ein Verzeichnis, das nicht vom Webserver bedient wird? –

+1

@just_name Ich meine, setze die Datei (en) an einen Ort, von dem IIS nichts weiß, so dass jeder, der die Links "rät", nicht zur Datei gelangen kann, weil IIS nichts davon weiß. Ihr Handler bedient dann die Datei, indem er auf diesen Platz zugreift, nachdem er Berechtigungen usw. geprüft hat. – Yahia

+0

ist es möglich, dass der 'generische Handler' auf die Datei zugreift, die außerhalb der Liste liegt –

1

Der beste Weg wäre Httphandlers hinzuzufügen und zu prüfen, ob die angeforderte Datei spezielle Berechtigungen hat oder nicht, ein Beispiel für das, was gesagt war ich:

 using Microsoft.VisualBasic; 
using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Data; 
using System.Diagnostics; 

public class MyHTTPHandler : IHttpHandler, IRequiresSessionState 
{ 

string myFile; 
public bool IsReusable { 
    get { return true; } 
} 

public void ProcessRequest(System.Web.HttpContext context) 
{ 
    myFile = context.Request.Path; 
    if (myFile.ToLower().Contains("members private files") || myFile.ToLower().Contains("members%20private%20files")) { 
     if (System.Web.HttpContext.Current.Session["Login"] == null) { 
      context.Response.Redirect("~/NotAuthorized.aspx"); 
     } else { 
      if (myFile.ToLower().Contains("privatefiles")) { 
       StartDownload(context, myFile); 
      } else { 
       if (IsMemberAuthoraizedToDownloadFile(context)) { 
        StartDownload(context, myFile); 
       } else { 
        context.Response.Redirect("~/NotAuthorized.aspx"); 
       } 
      } 
     } 
    } else { 
     StartDownload(context, myFile); 
    } 
} 

private void StartDownload(HttpContext context, string downloadFile) 
{ 
    context.Response.Buffer = true; 
    context.Response.Clear(); 
    context.Response.AddHeader("content-disposition", "attachment; filename=" + downloadFile); 
    context.Response.ContentType = "application/pdf"; 
    context.Response.WriteFile(downloadFile); 
} 

// just my own function to check if user is valid 

private bool IsMemberAuthoraizedToDownloadFile(HttpContext context) 
{ 
    GroupMembersControl MyGroupMemberc = new GroupMembersControl(); 
    System.Collections.Generic.List<GroupMembers> MemberGroupsL = MyGroupMemberc.GetMemberGroups(System.Web.HttpContext.Current.Session["Login"]); 
    MemberGroupControl MyGroupC = new MemberGroupControl(); 
    MemberGroup MyGroup = default(MemberGroup); 
    foreach (GroupMembers groupmember in MemberGroupsL) { 
     MyGroup = MyGroupC.GetMemberGroup(groupmember.GroupID); 
     if (myFile.ToLower().Contains(MyGroup.Name.ToLower)) { 
      return true; 
     } 
    } 
    return false; 
} 
    } 
2

Meine Antwort wäre: Dont direkte Verbindungen verwenden !

eine Download.aspx erstellen und die Links haben für Downloads Download.aspx posten? Params

Die params verschlüsselt werden soll/gehasht den Dateipfad + Name zum Herunterladen und Sitzungs_ID enthält.

Auf Download.aspx überprüfen Sie, dass die Session-ID gültig und aktiv im Browser ist.

Dies sollte Ihnen ermöglichen, Downloads auf die richtigen Leute nur zu erlauben:

Wenn Sie die params auch die user_id oder die user_type hinzufügen können Sie/Genehmigung Download auf der onLoad von Download.aspx

1

verweigern Der folgende Link enthält Details zu den Autorisierungsregeln in iis und asp.net. Er scheint für Ihre Frage relevant zu sein.

Zunächst möchten Sie sicherstellen, dass ASP.NET Anforderungen für den angegebenen Dateityp verarbeitet. Sie können dies in IIS konfigurieren (siehe Link unten).

Zweitens, werden Sie dann brauchen Ihre web.config zu aktualisieren anonyme Benutzer zu verweigern, von Ihrer URL zu erreichen, vorausgesetzt, Sie verwenden rolemanager:

<roleManager defaultProvider="SqlProvider" enabled="true" cacheRolesInCookie="false"  
    cookieName=".ASPROLES" cookieTimeout="30" cookiePath="/" cookieRequireSSL="false" 
    cookieSlidingExpiration="true" cookieProtection="All"> 
    <providers> 
    <add name="SqlProvider" type="System.Web.Security.SqlRoleProvider" 
     connectionStringName="membership" applicationName="yourApplication"/> 
    </providers> 
</roleManager> 



<location path="path/file.extension"> 
     <system.web> 
     <authorization> 
     <deny users="?"/> 
     </authorization> 
    </system.web> 
    </location> 

IIS 6 ignores Web.config authorization settings