2016-04-25 3 views
1

ich eine .net 2.0-Anwendung Formularauthentifizierung mit AD haben verwenden und ein Verzeichnis für Dokumente, die eine web.config-Datei konfiguriert wurde -ASP.NET Directory-Authentifizierung

<system.web> 
    <authorization> 
     <deny users="?"/> 
     <allow roles="Security Alerts - Admin"/> 
     <deny users="*"/> 
    </authorization> 
    </system.web> 

Wenn lokal zu testen, ob ich laufen die App und lege den FQDN für ein Dokument /site/documents/Document1.pdf ab. Ich komme auf die Login-Seite zurück, aber wenn ich die Site auf einem Server habe, kann ich die PDFs problemlos öffnen. Wie kann ich dies erzwingen, so dass, wenn ein Benutzer die URL eines Dokuments speichern und versuchen würde, direkt auf sie zuzugreifen, würden sie gezwungen werden, sich zuerst auf der Anmeldeseite zu authentifizieren?

Ich habe die gleiche Konfiguration für einen ADMIN-Ordner, der ASPX-Seiten enthält und richtig funktioniert und leitet die Benutzer zuerst die Anmeldeseite, ist es etwas mit dem Dokumenttyp zu tun, ein PDF im Gegensatz zu ASPX-Seiten.

Vielen Dank im Voraus.

Antwort

1

Die .NET-Authentifizierung funktioniert standardmäßig nicht mit statischen Dateien wie PDFs.

Sie müssen einen HTTP-Handler implementieren, der Ihre Dateien bereitstellt, wenn der Benutzer authentifiziert ist.

Es hört sich an, als wäre Ihre aktuelle Authentifizierung eingerichtet und funktioniert ordnungsgemäß, daher werde ich nicht auf die Grundlagen der Einrichtung eingehen.

Unten ist der relevante Code, der Ihrem Szenario von Kory Beckers hilfreichen Artikel hier genommen gilt:

http://www.primaryobjects.com/2009/11/11/securing-pdf-files-in-asp-net-with-custom-http-handlers

Sie offensichtlich die Pfade, Namespaces und Logik entsprechen Ihrer Umgebung werden müssen ändern (zB IIS-Version) und/oder bestimmte Dateitypanforderungen.

Schritt 1 - eine FileProtectionHandler Klasse erstellen, die IHttpHandler

public class FileProtectionHandler : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     switch (context.Request.HttpMethod) 
     { 
      case "GET": 
      { 
       // Is the user logged-in? 
       if (!context.User.Identity.IsAuthenticated) 
       { 
        FormsAuthentication.RedirectToLoginPage(); 
        return; 
       } 

       string requestedFile = context.Server.MapPath(context.Request.FilePath); 

       // Verify the user has access to the User role. 
       if (context.User.IsInRole("Security Alerts - Admin")) 
       { 
        SendContentTypeAndFile(context, requestedFile); 
       } 
       else 
       { 
        // Deny access, redirect to error page or back to login page. 
        context.Response.Redirect("~/User/AccessDenied.aspx"); 
       } 

       break; 
      } 
     } 
    } 

    public bool IsReusable { get; private set; } 

    private HttpContext SendContentTypeAndFile(HttpContext context, String strFile) 
    { 
     context.Response.ContentType = GetContentType(strFile); 
     context.Response.TransmitFile(strFile); 
     context.Response.End(); 

     return context; 
    } 

    private string GetContentType(string filename) 
    { 
     // used to set the encoding for the reponse stream 
     string res = null; 
     FileInfo fileinfo = new FileInfo(filename); 

     if (fileinfo.Exists) 
     { 
      switch (fileinfo.Extension.Remove(0, 1).ToLower()) 
      { 
       case "pdf": 
       { 
        res = "application/pdf"; 
        break; 
       } 
      } 

      return res; 
     } 

     return null; 
    } 
} 

Schritt 2 implementiert - Datei Fügen Sie die folgenden Abschnitte zu Ihrer web.config (mit den entsprechenden Pfad/Namespace-Änderungen)

<httpHandlers> 
... 
<add path="*/User/Documents/*.pdf" verb="*" validate="true" type="CustomFileHandlerDemo.Handlers.FileProtectionHandler" /> 
</httpHandlers> 

<system.webServer> 
... 
<handlers> 
<add name="PDF" path="*.pdf" verb="*" type="CustomFileHandlerDemo.Handlers.FileProtectionHandler" resourceType="Unspecified" /> 
... 
</handlers> 
</system.webServer> 
+0

Danke @Scotty - Ich werde das versuchen und Sie wissen lassen, wie es geht. – KlydeMonroe

+0

Hallo @Scotty - Ich habe an der Implementierung gearbeitet, wie Sie oben dem Beispiel vorgeschlagen haben, und es scheint nicht zu funktionieren. Ich habe ein neues Verzeichnis mit dem Namen 'Handlers' erstellt und die Klasse 'FileProtectionHandler' erstellt und die Weiterleitung in die Login.aspx für meine Anwendung geändert. Ich habe dann die Bits zu meiner Anwendung hinzugefügt web.config Hauptdatei - den Pfad zu meiner App '*/documents/*. Pdf' und type = 'Alerts.Handlers.FileProtectionHandler' ändern und ich verwende IIS7, also habe hinzugefügt Handler Mapping zu diesem. Ich bekomme jetzt und HTTP 500.23 Fehler, irgendwelche Vorschläge? – KlydeMonroe

+1

Ich habe es geschafft, dies zu erreichen, indem ich - vor dem Handler-Tag in meiner Web-Konfigurationsdatei hinzufüge. Danke für deine Hilfe – KlydeMonroe