2012-04-03 13 views
9

Ich habe einen Webserver von wo Benutzer Dateien herunterladen können, die für jeden Benutzer spezifisch sind. Um sicher zu sein, dass jeder Benutzer nur seine eigenen Dateien herunterladen kann, muss er sich über Basic-Authentication authentifizieren. Für jeden Benutzer gibt es also einen Windows-Account auf dem Server, der Berechtigungen für den benutzerspezifischen Ordner hat.Web.config erlauben Standort Zugriff für bestimmte Benutzer

Jetzt möchte ich diese Funktionalität auf einen anderen Server verschieben. Ich möchte keine Windows-Konten für die Benutzer erstellen, aber die Basis-Authentifizierung beibehalten. Also verwende ich die Custom Basic Authentication HTTP Module in Kombination mit einer Custom MembershipProvider, die ich Benutzer in der web.config definieren kann.

Die Authentifizierung funktioniert recht gut, aber nachdem sich mit entweder jack anmelden oder jill (siehe web.config) Ich bin in der Lage, beiden Standorte Dir1 und Dir2 zuzugreifen. Dies ist auch der Fall, wenn ich den <allow users="jack" /> Teil in den Standort-Tags auskommentiere.

Zusätzliche Information: habe ich eine Datei Default.aspx und hat eine

<% Response.Write(HTTPContext.Current.User.Identity.Name) %> 

, die den richtigen Benutzernamen in Abhängigkeit davon gibt, der angemeldet

<% Response.Write(HTTPContext.Current.User.Identity.IsAuthenticated) %> 

gibt Wahr zurück..

Was muss ich tun, dass nur jack der Lage ist, den Zugang (= Download-Dateien aus) Dir1 und nur jill der Lage ist, den Zugang (= Download-Dateien aus) Dir2 aber nicht umgekehrt?

EDIT: Ich habe versucht, web.config-Dateien für jedes Unterverzeichnis statt der Standort-Tags wie von utkai erwähnt hinzufügen - mit dem gleichen Ergebnis. Jeder Benutzer kann auf jedes Verzeichnis zugreifen.

Hier ist meine Datei Web.config:

<configuration> 
<system.webServer> 
    <modules> 
     <add name="CustomBasicAuthentication" type="LeastPrivilege.CustomBasicAuthentication.CustomBasicAuthenticationModule, LeastPrivilege.CustomBasicAuthenticationModule, Version=1.0.0.0, Culture=neutral, PublicKeyToken=F20DC168DFD54966"/> 
    </modules> 

    <security> 
     <authentication> 
      <customBasicAuthentication enabled="true" realm="TEST" providerName="AspNetWebConfigMembershipProvider" cachingEnabled="true" cachingDuration="15" requireSSL="false"/> 
     </authentication> 
     <authorization> 
      <deny users="?" /> 
     </authorization> 
    </security> 
</system.webServer> 

<system.web> 
    <membership defaultProvider="AspNetWebConfigMembershipProvider"> 
     <providers> 
      <add name="AspNetWebConfigMembershipProvider" type="LeastPrivilege.AspNetSecurity.Samples.WebConfigMembershipProvider, WebConfigMembershipProvider"/> 
     </providers> 
    </membership> 

    <authentication mode="Forms"> 
     <forms> 
      <credentials passwordFormat="Clear"> 
       <user name="jack" password="jack"/> 
       <user name="jill" password="jill"/> 
      </credentials> 
     </forms> 
    </authentication> 

    <authorization> 
     <deny users="?" /> 
    </authorization> 
</system.web> 

<location path="Dir1" allowOverride="false"> 
    <system.web> 
     <authorization> 
      <!-- <allow users="jack" /> --> 
      <deny users="*" /> 
     </authorization> 
    </system.web> 
</location> 

<location path="Dir2" allowOverride="false"> 
    <system.web> 
     <authorization> 
      <!-- <allow users="jill" /> --> 
      <deny users="*" /> 
     </authorization> 
    </system.web> 
</location> 
</configuration> 
+1

Ich brauche etwas Zeit für meine Forschungsarbeit. Wird dich bald aktualisieren. – Pankaj

+0

** Ich kann auf beide Standorte zugreifen Dir1 und Dir2 ** Haben Sie Directory Browsing in Ihrem Webserver IIS aktiviert? – Pankaj

+0

Nein Ich habe keine Verzeichnissuche aktiviert. Was ich meinte war, dass ich Dateien, die in diesen Verzeichnissen enthalten sind, ansehen/herunterladen kann, unabhängig davon, welcher Benutzer sich angemeldet hat. –

Antwort

8

Update # 3

Sie können URLAuthorization ermöglichen IIS zu zwingen, Dateien zu schützen, die in IIS normalerweise nicht verarbeitet werden. Die Lösung hängt hier von IIS 7.x ab und verwendet integrierte Pipelines.

<system.webServer> 
    <modules> 
     <add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule" /> 
     <remove name="UrlAuthorization" /> 
     <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" /> 
     <remove name="DefaultAuthentication" /> 
     <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" /> 
    </modules> 
</system.webServer> 

Aktualisiert # 2 Sie nur ganz Formularauthentifizierung wechseln können, indem Sie die benutzerdefinierte Dinge Entfernen Sie hinzugefügt haben und die folgende tun.

Ich habe dies tatsächlich getestet und erlaubt es nur Buchse um dir1 und jill in dir2. Beide können auf die Wurzel zugreifen.

Wenn dies nicht funktioniert, müssen wir weitere Einstellungen besprechen.

web.config

<?xml version="1.0"?> 
<configuration> 
<system.webServer> 
    <modules> 
     <add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule" /> 
     <remove name="UrlAuthorization" /> 
     <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" /> 
     <remove name="DefaultAuthentication" /> 
     <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" /> 
    </modules> 
</system.webServer> 
    <system.web> 
     <authentication mode="Forms"> 
      <forms loginUrl="Login.aspx" defaultUrl="Default.aspx"> 
       <credentials passwordFormat="Clear"> 
        <user name="jack" password="jack" /> 
        <user name="jill" password="jill" /> 
       </credentials> 
      </forms> 
     </authentication> 
     <authorization> 
      <deny users="?"/> 
     </authorization> 
     <compilation debug="true"></compilation> 
     <customErrors mode="Off"/> 
    </system.web> 
    <location path="dir1"> 
     <system.web> 
      <authorization> 
       <allow users="jack" /> 
       <deny users="*, ?" /> 
      </authorization> 
     </system.web> 
    </location> 
    <location path="dir2"> 
     <system.web> 
      <authorization> 
       <allow users="jill" /> 
       <deny users="*, ?" /> 
      </authorization> 
     </system.web> 
    </location> 
</configuration> 

Login.aspx - Sie müssen in der Umleitung von der Login-Steuerelement hinzugefügt werden, da sonst die Authentifizierung Formulare für eine Datenbank im Verzeichnis App_Code aussehen wird, das nicht der Fall ist existieren.

<asp:Login ID="Login1" runat="server" OnAuthenticate="Login1_Authenticate"> 
</asp:Login> 

Login.aspx.cs

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) 
    { 
     string username = Login1.UserName; 
     string password = Login1.Password; 
     if (FormsAuthentication.Authenticate(username, password)) 
     { 
      FormsAuthentication.RedirectFromLoginPage(username, false); 
     } 
    } 

Update # 1

ich durch das Beispiel ging, die Sie als benutzerdefinierte Standardauthentifizierung HTTP-Modul verknüpft und dann durch zu folgen The HTTP Module Das hat eine Verbindung ganz unten zu einer zusätzlichen Quelle.

Diese Quelle verfügt über ein Mitgliedschaftsanbieterbeispiel, das die benutzerdefinierte Standardauthentifizierung verwendet. Ich habe das Gefühl, dass Sie Probleme bekommen, indem Sie den Forms-Mitgliedschaftsanbieter in Ihrer web.config einmisten.

Wenn Sie beginnen, Ihre eigene separate Authentifizierung zu machen, gehen die Dinge nicht gut und Sie müssen in der Regel Ihre eigenen hinzufügen.

Dieser Code funktioniert von diesem zusätzlichen Link an meinem Ende. Wenn Sie möchten, dass ASP.NET alle Mitglieder selbst verwaltet und Sie SQL verwenden, um alles zu speichern, sollten Sie sich die Version http://weblogs.asp.net/sukumarraju/archive/2009/10/02/installing-asp-net-membership-services-database-in-sql-server-expreess.aspx ansehen, um zu erfahren, wie Sie den Assistenten in SQL verwenden können .

Die integrierte Mitgliedschaft wird Forms-Authentifizierung sein und viel weniger Arbeit als die Verwendung von benutzerdefinierten sein.

vorherige Version

Ich hatte noch nie Glück mit mit den <location> Tags so dass ich nur neuen web.configs in den Verzeichnissen setzen. Ich habe auch Probleme gehabt, wenn ich anonym in Unterordnern nicht ausschließe. Dies scheint zu sein, dass der Browser standardmäßig zu anonym wird, was durch

geht Hier ist, wie ich es mache.

Wurzel web.config

<system.web> 
    <authorization> 
     <allow roles="AccessRole1, AccessRole2" users="domain\jack, domain\jill"/> 
     <deny users="*, ?" /> <!-- make sure you deny anonymous with '?' --> 
    </authorization> 
</system.web> 

Sub-Verzeichnis web.config. Stellen Sie sicher, dass Sie alle anderen Benutzer explizit ablehnen. Wenn Sie nicht alle anderen Benutzer verweigern, können sie immer noch in bekommen.

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
     <authorization> 
      <allow users="domain\jill" /> 
      <deny users="*, ?"/> <!-- explicitly deny all others, including anonymous --> 
     </authorization> 
    </system.web> 
</configuration> 
+0

Ich habe keine Rollen oder Domainbenutzer. Ich habe versucht, die anonymen Benutzer ebenfalls auszuschließen, aber ich habe immer noch das gleiche Problem. Ich denke, dass das Problem irgendwo mit dem benutzerdefinierten MembershipProvider und/oder CustomAuthentication sein kann. –

+0

Können Sie die Details Ihres Mitgliedschafts-/Authentifizierungscodes angeben? Ich habe ein paar einfache in der Vergangenheit erstellt und kann eine Hilfe sein. – Kirk

+0

Wie in der Frage erwähnt, habe ich den MembershipProvider von hier: http://www.leastprivilege.com/PermaLink.aspx?guid=628c9d74-9039-4465-8533-e821506aa9a2 mit der Erweiterung http: //www.leastprivilege. com/ASPNETMembershipProviderForWebconfig2ndTry.aspx in Kombination mit dem HTTP-Modul. Bitte lassen Sie mich wissen, welche Informationen Sie benötigen. Danke –

2

Hier ist ein Link zu einem guten Artikel mit Details zu mehreren Situationen, in die man erlauben möchte/verweigert den Zugriff auf bestimmte Seite oder einen Ordner:

Setting authorization rules for a particular page or folder in web.config

als Neben Kommentar, wir in einem Projekt zu tun, verwenden wir die Möglichkeit, einzelne Datei web.config in jedem Ordner, wie in der Verbindung als auch angegeben, und es funktioniert nur für uns in Ordnung.

Hoffentlich hilft es, Ihr Problem zu lösen.

+0

Vielen Dank für Ihre Antwort. Ich habe separate web.config-Dateien für die Unterverzeichnisse hinzugefügt, wie Sie sagten. Aber das Problem ist das gleiche. Jeder Benutzer kann weiterhin auf jedes Unterverzeichnis zugreifen. –

0

Mit dieser Schritt-für-Schritt-Anleitung, den Tag in die Datei Web.config anwenden Zugriff konfigurieren zu einer bestimmten Datei und einem bestimmten Ordner.

<location path="default1.aspx"> 
    <system.web> 
     <authorization> 
      <allow users ="*" /> 
     </authorization> 
    </system.web> 
</location> 
<!-- This section gives the unauthenticated user access to all of the files that are stored in the Subdir1 folder. --> 
<location path="subdir1"> 
    <system.web> 
     <authorization> 
      <allow users="Admin" /> 
     </authorization> 
    </system.web> 
</location> 

More info...

0

Stellen Sie die folgenden in Ihrem Web.config

<modules runAllManagedModulesForAllRequests="false">

Platz folgende Ereignis in Ihrem Global.asax Datei.

protected void Application_BeginRequest(Object sender, EventArgs e) 
{ 
} 

Jetzt, wenn Sie die URL wie folgt eingeben.

http://localhost/dir1/jack.txt

Die Steuerung wird immer auf Application_BeginRequest Ereignis bewegen. Sie haben Request.Url Informationen und Current User information und Sie können die Validierung hier tun.

Code unten verwenden

throw new HttpException(403,"Acess Denied");

oder den Benutzer auf einige andere Seite mit einiger benutzerfreundliche Nachricht senden.

Verwandte Themen