2016-05-30 10 views
3

Ich habe eine Anwendung in .net vb und SQLServer entwickelt, möchte ich Dateien js beschränken, um für angemeldete Benutzer verfügbar zu sein, aber sonst einen Fehler 403 oder ähnliches zurückgeben. Zum Beispiel sollte ein Benutzer in der Lage sein, media/js/controller/myController.js nur, wenn sie eingeloggt sind.Zugriff auf js-Datei beschränken, wenn nicht angemeldet

Ich weiß, wie die tatsächliche Anzeige der Dateien aspx, Aschx und Ascx zu steuern, wenn sie nicht angemeldet sind, aber nicht wie zu blockieren Zugriff auf die js-Datei, wenn sie den Link direkt in ihrem Browser aufrufen, zum Beispiel http://www.myapp.com/media/js/controller/myController.js. Es ist mein Code Javascript.

Wie kann ich das erreichen?

UPDATE

Es ist mein Authentifizierungsmodus in meinem web.config

<!--<authentication mode="Windows"/>--> 
<authentication mode="Forms"> 
    <forms name="AuthCookie" path="/" loginUrl="login.aspx" protection="All" timeout="2000"> 
    <credentials passwordFormat="Clear" /> 
    </forms> 
</authentication> 
<authorization> 
    <!--<allow roles="***" /> 
    <deny users="*" />--> 
    <deny users="?" /> 
    <allow users="*" /> 
</authorization> 
+0

Die schnelle Antwort ist, können Sie nicht. Der Browser des Endbenutzers muss auf die Dateien zugreifen, um Ihre Site auf seiner Seite rendern zu können. Ohne Zugriff auf die .js-Dateien können sie die Site einfach nicht wie gewünscht darstellen. Es könnte eine Chance sein, dies mit Hilfe von .htaccess Magie zu erreichen, aber ich bin mir nicht sicher, ob ich diesen Weg gehen würde, wenn es eine wichtige Seite wäre. – JaggenSWE

+0

@JaggenSWE Ist richtig, ich verstehe, dass der Browser Zugriff auf js-Dateien benötigt, um zu arbeiten, aber ich wollte den Zugriff beschränken, während Sie nicht geloggt haben (Block Zugriff auf einen Ordner vielleicht) – CMedina

+0

Sie können mit .htaccess 'gültig gehen Benutzer ', andernfalls müssen Sie diese js-Datei wie jede andere eingeschränkte Seite aus dem Backend generieren. – faster

Antwort

2

JS-Dateien gelten als statischer Inhalt und .NET behandelt sie standardmäßig nicht.

Von MSDN:

standardmäßig verarbeitet IIS statischen Inhalten selbst - wie HTML-Seiten und CSS und Bilddateien - und nur Hände weg Anfragen an die ASP.NET-Laufzeit, wenn eine Seite mit der Erweiterung. aspx, .asmx oder .ashx wird angefordert.

Sie können die Konfiguration manuell festlegen, um .js-Dateien zu verarbeiten. Beachten Sie, dass dies einen zusätzlichen Aufwand verursacht, da sie die .NET-Pipeline durchlaufen.

in Ihre web.config:

<compilation> 
    <buildProviders> 
    <remove extension=".js" /> 
    <add extension=".js" type="System.Web.Compilation.PageBuildProvider" /> 
    </buildProviders> 
</compilation> 

Und:

<system.webServer> 
    <handlers> 
    <add name="JS" path="*.js" verb="GET, HEAD, POST, DEBUG" type="System.Web.UI.PageHandlerFactory" resourceType="Unspecified" requireAccess="Script" /> 
    </handlers> 
</system.webServer> 

Jetzt, da Ihre web.config bereits eine globale Regel hat nicht authentifizierte Benutzer von .NET-Ressourcen zu verweigern, diese Einstellungen schränkt auch alle JS-Dateien ein.

Deshalb sollten Sie den Pfad zu den öffentlichen js Dateien öffnen, die Sie nicht wollen, von nicht authentifizierten Benutzern blockieren:

<location path="public-js-folder-path"> 
    <system.web> 
    <authorization> 
     <allow users="*"/> 
    </authorization> 
    </system.web> 
</location> 

Hoffe, es hilft. Wenn Sie irgendwelche Fragen haben, sagen Sie es mir bitte.

+0

Ich habe es versucht und den Fehler ' Pfadattribut muss ein relativer virtueller Pfad sein. Es darf keine'? ' ':' '\' '*' '' '' '' <' '> 'oder' | '.' Meine Route von js-Dateien lautet: 'static/xyz/js' – CMedina

+0

@CMedina Was ist der Standortpfad, den Sie eingeben? –

+0

meine Route js Dateien ist 'static/xyz/js' – CMedina

2

Sie Javascript dienen kann wie jedes andere Inhalte von jedem serverseitige Skriptsprache dienen werden. Solange Sie die entsprechenden Header setzen, wird der Webbrowser mit dem Ergebnis zufrieden sein.

Ich führe Produktionscode, wo angemeldete Besucher in der HTML durch eine <script>-Tag auf eine PHP-URL verwiesen werden.

Der PHP-Code dann:

  • überprüft, ob der Benutzer in der Tat in
  • protokolliert wird sendet einen Header Content-Type: application/javascript
  • und gibt dann nur den Quellcode des Javascript

Das ist es.

Sollte in .NET nicht anders sein.

Alternativ: wo Sie das HTML ausgeben, könnten Sie auch das Javascript inline ausgeben. Und daher kein Vorteil, dass der Browser die js zwischenspeichert.

Sehen Sie hier auch für .NET-Code: How do you output raw javascript in asp.net

5

Ich bin nicht sicher, warum Sie kümmern Ihre JavaScript-Dateien zu beschränken, sondern diese Dateien über den Controller dienen verwenden.

public class ScriptsController : Controller 
{ 
    //option 1. Have one method for all the files. 
    [LoggedIn] 
    public ActionResult Get(string fileName) 
    { 
     return File(Server.MapPath("~/media/js/" + fileName + ".js"), "text/javascript"); 
    } 
    //option 2: have a method for each file 
    [LoggedIn] 
    public ActionResult main() 
    { 
     return File(Server.MapPath("~/media/js/main.js"), "text/javascript"); 
    } 
} 

In der Route Config

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 

     routes.MapRoute(
       "JSFiles", 
       "{controller}/{fileName}", 
       new { controller = "Scripts", action = "Get" } 
      ); 
    } 
} 

Wenn Sie diese Methode in Ihrem "ScriptsController" setzen, würde die URL so etwas wie http://www.myapp.com/Scripts/Get/main sein, wo Haupt der Name des JavaScript-Controller ist.

Um den direkten Download zu verhindern, können Sie dies in der Web-Konfiguration festlegen oder die Dateien an einem nicht versorgten Speicherort auf dem Server ablegen. In jedem Fall. Web Config wäre wahrscheinlich auf lange Sicht besser.

Web-Config Weise

<location path="media"> 
    <system.web> 
     <authorization> 
      <deny users="*"/> 
     </authorization> 
    </system.web> 
</location> 

Sie auch die Validierung hinzufügen sollte der Benutzer dienen, andere Dateien als die js Dateien (wie die Web-Config, etc.)

+0

Es ist eine gute Lösung, leider arbeite ich nicht mit Controller und Pfad, die Rolle des Controllers macht es eine Aschx-Datei. – CMedina

3

Wenn ich dienen soll verhindern verstehe es richtig, alles, was Sie tun möchten, ist Benutzer auf Login-Seite umleiten, wenn Benutzer die URL eingibt und direkt auf die Seite geht. Während Asp.net-Seiten Optionen bieten, um dies zu deaktivieren, ist dies für js-Dateien nicht verfügbar. Z.B. Wenn ein Benutzer in der URL-Leiste xyz.com\adminsection\admin.aspx eingibt, sollte er zu xyz.com\login.aspx umleiten. Dasselbe sollte passieren, wenn der Benutzer xyz.com\adminsection\JS\admin.js eingibt.

In diesem Fall müssen Sie keine Codeänderung vornehmen. Dies ist nur eine kleine Konfigurationseinstellung. Fügen Sie einfach auf die Datei web.config

<location path="YourJSFolderHere (e.g. adminsection\JS)"> 
    <system.web> 
    <authorization> 
     <deny users="?" /> 
    </authorization> 
    </system.web> 
</location> 

Sie müssen fügen Sie diese für jeden Ordner in Frage folgenden Code ein.

Beachten Sie, dass dies ordnungsgemäß funktioniert, wenn der Benutzer nicht angemeldet ist. Wenn der Benutzer jedoch angemeldet ist und xyz.com\adminsection\JS\admin.js eingibt, kann der Benutzer die js-Datei herunterladen.

+0

Ich habe es selbst versucht. Es funktioniert für nicht authentifizierte Benutzer. – jitendragarg

+0

Ich habe es versucht und den Fehler bekommen Pfad Attribut muss ein relativer virtueller Pfad sein. Es darf kein '?' ':' '\' '*' '' '' '' <' '> 'oder' | '.' Meine Route von js-Dateien lautet: 'static/xyz/js' – CMedina

+0

Ich glaube, Sie verwenden den falschen Pfad. \ static \ xyz \ js', genauso wie Sie es in der aspx-Datei verwenden. – jitendragarg

Verwandte Themen