web-dev-qa-db-fra.com

Web.config permet l'accès à l'emplacement pour un utilisateur spécifique

J'ai un serveur Web à partir duquel les utilisateurs peuvent télécharger des fichiers spécifiques à chaque utilisateur. Pour être sûr que chaque utilisateur ne peut télécharger que ses propres fichiers, il doit s'authentifier via Basic-Authentication . Donc, pour chaque utilisateur, il existe un compte Windows sur le serveur qui dispose d'autorisations de lecture sur le dossier spécifique de l'utilisateur.

Maintenant, je veux déplacer cette fonctionnalité sur un autre serveur. Je ne souhaite pas créer de comptes Windows pour les utilisateurs, mais conserve néanmoins l'authentification de base. J'utilise donc le module HTTP - Authentification personnalisée de base personnalisée en combinaison avec un Custom MembershipProvider qui me permet de définir des utilisateurs dans le fichier web.config.

L'authentification fonctionne assez bien, mais après m'être connecté avec jack ou jill (voir web.config), je suis en mesure d'accéder aux deux emplacements Dir1 et Dir2. C'est également le cas si je commente la partie <allow users="jack" /> dans les balises d'emplacement.

Informations supplémentaires: J'ai créé un fichier Default.aspx et ajouté un 

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

qui renvoie le nom d'utilisateur correct en fonction de celui qui s'est connecté.

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

renvoie True.

Que dois-je faire pour que seule jack puisse accéder (= télécharger des fichiers depuis) ​​Dir1 et que seule jill puisse accéder (= télécharger des fichiers depuis) ​​Dir2 mais pas l'inverse?

EDIT: J'ai essayé d'ajouter des fichiers web.config pour chaque sous-répertoire au lieu des balises d'emplacement mentionnées par utkai - avec le même résultat. Chaque utilisateur peut accéder à n'importe quel répertoire.

Voici mon fichier 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>
9

Mise à jour # 3

Vous pouvez activer URLAuthorization pour forcer IIS à protéger les fichiers qui ne sont pas traités normalement dans IIS. La solution dépend de IIS 7.x et de l’utilisation de pipelines intégrés.

<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>

Mise à jour # 2 Vous pouvez basculer entièrement vers l'authentification par formulaires uniquement en supprimant les éléments personnalisés que vous avez ajoutés et en procédant comme suit.

En fait, j'ai testé cela et il ne permet que jack dans à dir1 et jill dans dir2. Les deux peuvent accéder à la racine.

Si cela ne fonctionne pas, nous devrons discuter davantage de votre configuration.

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 - Vous devez ajouter la redirection à partir du contrôle Login, sinon l'authentification par formulaires recherchera une base de données dans le répertoire App_Code, qui n'existe pas.

<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);
        }
    }

Mise à jour # 1

J'ai suivi l'exemple que vous avez lié en tant que module HTTP d'authentification de base personnalisée, puis suivi jusqu'à Le module HTTP qui comporte un lien situé tout en bas de la source supplémentaire.

Cette source contient un exemple de fournisseur d'adhésion utilisant l'authentification de base personnalisée. Je sens que vous rencontrez des problèmes en mélangeant le fournisseur d’adhésion aux formulaires que vous avez dans votre Web.config.

Lorsque vous commencez à créer votre propre authentification distincte, les choses ne se passent pas bien et vous devez généralement ajouter votre propre tout.

Ce code fonctionne à partir de ce lien supplémentaire de mon côté.

Si vous souhaitez laisser ASP.NET gérer l’ensemble des membres et si vous utilisez SQL pour tout stocker, envisagez de consulter http://weblogs.asp.net/sukumarraju/archive/2009/. 10/02/installation-asp-net-adhésion-services-base-de-données-en-sql-server-expreess.aspx pour savoir comment utiliser l'assistant pour le configurer en SQL.

L'adhésion intégrée sera l'authentification par formulaires et nécessitera beaucoup moins de travail que l'utilisation de la personnalisation.

Version précédente

Je n'ai jamais eu la chance d'utiliser les balises <location>, alors je viens de mettre de nouveaux web.configs dans les répertoires. J'ai également eu des problèmes lorsque je n'exclus pas anonyme dans les sous-dossiers. Cela semble être que le navigateur sera anonyme par défaut et passera à travers

Voici comment je le fais.

Web.config racine

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

Sous-répertoire web.config. Assurez-vous de refuser explicitement tous les autres utilisateurs. Si vous ne refusez pas à tous les autres utilisateurs, ils peuvent toujours entrer.

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

Voici un lien vers un bon article avec des détails sur plusieurs situations, dans lequel on voudrait autoriser/refuser l'accès à une page ou à un dossier particulier:

Définition de règles d'autorisation pour une page ou un dossier particulier dans web.config

En tant que commentaire parallèle, dans l'un de nos projets, nous utilisons l'option de fichier web.config individuel dans chaque dossier, comme indiqué dans le lien également, et cela fonctionne parfaitement pour nous.

J'espère que cela aidera à résoudre votre problème.

2
utsikko

Utilisez ce guide pas à pas pour appliquer la balise au fichier Web.config afin de configurer l’accès à un fichier et à un dossier spécifiques.

<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>

Plus d'informations...

0
Majid Hosseini

cette approche est similaire mais différente - l'emplacement est un fichier au lieu d'un répertoire: 

Est-il possible d'autoriser un utilisateur anonyme à parcourir seulement quelques fichiers d'un dossier

0
wazz

Définissez les éléments suivants dans votre Web.config

<modules runAllManagedModulesForAllRequests="false">

Placez l'événement suivant dans votre fichier Global.asax.

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

Maintenant, chaque fois que vous tapez l'URL comme ci-dessous.

http: //localhost/dir1/jack.txt

Le contrôle sera toujours déplacé vers l'événement Application_BeginRequest. Vous avez les informations Request.Url et Current User information et vous pouvez effectuer la validation ici.

Utiliser le code ci-dessous

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

ou envoyer l'utilisateur à une autre page avec un message convivial.

0
Pankaj