IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Accès fichiers + sécurité


Sujet :

ASP.NET

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 156
    Par défaut Accès fichiers + sécurité
    Bonjour,

    je suis en train de développer un petit extranet sur un de mes sites web.
    Sur cet extranet, accessible via login et mot de passe (sqlmembershipprodiver standard), les utilisateurs auront accès à des fichiers pdf qui ne seront visibles que par eux.
    Le contenu de mon site est stocké dans une base SQL Server 2008 Express, et je compte donc m'en servir pour mon extranet.
    Ces fichiers pdf seront stockés sur le serveur web (dans l'idéal, la structure de stockage sera la suivante : MON_SERVEUR\DOSSIER_ANNEE\DOSSIER_MOIS\DOSSIER_JOUR.

    Mon problème est que, premièrement, je ne sais pas quelle méthode utiliser pour lister et afficher les pdf en fonction de l'utilisateur.
    Ensuite, une personne responsable de l'extranet mettra à disposition les fichiers pdf (dans les bons dossiers) et cette même personne devrait faire en sorte de matcher un client de l'extranet avec tel et tel fichier pdf qu'il vient d'uploader.

    Voilà l'idée globale du projet, mais je ne sais pas comment m'y prendre pour réellement mettre ça en place.

    Et éventuellement, pour des raisons de sécurités, il faudrait créer un système de jeton temporaire pour chaque fichier pdf.

    Auriez-vous des idées?

    Merci à tous

  2. #2
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Salut
    Citation Envoyé par penchu Voir le message
    Auriez-vous des idées?
    Y'a des chances, mais il faudrait que tu apportes un peu plus que cette expression de besoin minimaliste...

    Déjà il y a plusieurs sujets:
    • Identification;
    • Sécurité;
    • Stockage de fichiers.
    Chacun devrait être traité séparément (via un projet dédié par exemple). L'identification et le contrôle d'accès à une application sont des questions pour lesquelles il y a de nombreuses réponses sur internet.

    Pour le stockage de fichiers, c'est la base de données qui contiendra toutes les informations. Il n'est pas nécessaire de les ranger. Si malgré tout tu veux le faire, pose toi la question de savoir comment tu voudrais y accéder si tu devais aller chercher dedans. C'est un peu comme une bibliothèque.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 156
    Par défaut
    Bonjour Immobilis,

    merci pour ton retour.

    Au niveau de l'identification et du contrôle d'accès, j'ai déjà fait une bonne partie du travail, dans le même projet, mais ça fonctionne très bien (même s'il y a certainement moyen d'améliorer la sécurité, mais ...).

    Je souhaiterai en fait stocker dans la db le chemin (relatif) des fichiers, en association avec l'identifiant de la personne qui pourra visualiser ce(s) fichier(s).

    J'avais pensé mettre les fichiers sur le serveur web, dans un dossier par utilisateur.
    L'utilisateur verra alors la hiérarchie de ses dossiers et fichiers qui lui sont autorisés.

    Les fichiers seront uploadés par une seule personne dans les bons dossiers.
    Ca me semble une solution facile en terme de gestion (upload et visualtion des fichiers), mais si je fais ça, comment mettre en place une sécurité d'accès sur les dossiers?
    Comment empêcher qu'un fichier soit visible par n'importe qui qui tenteraient d'y avoir accès?

    Merci

  4. #4
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Citation Envoyé par penchu Voir le message
    Comment empêcher qu'un fichier soit visible par n'importe qui qui tenteraient d'y avoir accès?
    Le serveur sur lequel sont les fichiers doivent rester inaccessibles directement. Il faudra passer par l'application web. C'est ce que tu comptais faire ou sinon, j'ai pas compris le besoin.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 156
    Par défaut
    En fait, oui, le visiteur doit se loguer sur le site web pour avoir accès l'extranet et ainsi pouvoir voir les fichiers disponibles pour lui.
    Tant qu'il n'est pas logué, il est redirigé vers la page de login.
    Pour cette partie là, c'est ok, mais comment empêcher que le visiteur1 copie l'url d'un fichier qui lui est attribué et ne donne l'url de ce fichier à un visiteur2 (par mégarde pour mauvaise intention).
    C'est un peu ça aussi mon problème.

    Cordialement,

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 51
    Par défaut
    Bonjour,

    Pour éviter qu'un utilisateur B puisse télécharger un fichier de l'utilisateur A, il y a une solution très simple :
    - mettre en place un HttpHandler ou une page ASPX
    - cette page doit vérifier les droits de l'utilisateur (est-ce qu'il a accès au fichier),
    - si oui, la page doit envoyer le contenu du fichier PDF (et surtout pas faire de redirection vers le fichier sur le serveur).

    Avec ce mécanisme, chaque demande va passer par l'application web et donc valider les droits.

    Pour plus de sécurité, le fichier PDF "original" ne doit pas être accessible directement par un navigateur Web.

    Pascal

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 156
    Par défaut
    Super ta réponse, merci.
    Je vais donc me tourner soit vers le httphandler (que je n'ai jamais utilisé).

    Par contre, pour ce qui est des fichiers pdf, hormis le fait de les mettre dans un dossier du serveur accessible à personne, y a-t-il un autre moyen de les rendre inaccessible dans un navigateur?

    Merci

  8. #8
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    A partir du moment où les fichiers ne sont pas dans l'arborescence du site ils sont inaccessibles. Sinon, tu peux aussi les mettre en base, mais ça joue sur les performances.
    "Winter is coming" (ma nouvelle page d'accueil)

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 156
    Par défaut
    Salut Immobilis,

    je vais alors mettre les fichiers dans un espace différent sur le serveur.
    Je ne suis pas super fan de mettre les fichiers en binaire dans la base.

    Par contre, j'ai mis en place un httpHandler, et il faut bien avouer que ça marche super bien.

    Merci beaucoup pour ton aide précieuse.

  10. #10
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Si tu peux nous mettre ton implémentation, ce sera utile pour d'autres.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  11. #11
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 156
    Par défaut
    Pas de soucis.

    Voici mon handler (downloadPdf.ashx)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    <%@ WebHandler Language="C#" Class="downloadPdf" %>
     
    using System;
    using System.Web;
    using System.IO;
     
    public class downloadPdf : IHttpHandler 
    {    
        public void ProcessRequest (HttpContext context) 
        {
            var r = context.Response;
            r.ContentType = "application/pdf";
     
            try
            {
                if (HttpContext.Current.Request.QueryString["file"] != null)
                {
                    var file = HttpContext.Current.Request.QueryString["file"].ToString();
     
                    r.AddHeader("Content-Disposition", "attachment; filename=" + file);
                    r.WriteFile(Path.Combine("~\\PDF", file));
                }
     
     
            }
            catch (Exception ex)
            {
                context.Response.Redirect("Error.aspx?err=301"); 
                r.Flush();
                context.Response.Write("Error downloading file..<br/>Detail:<br/>" + ex.Message);
            }
        }
     
        public bool IsReusable 
        {
            get 
            {
                return false;
            }
        }
    }
    Ensuite, voici le code behind de ma page extranet (elle n'en est qu'à ses tous débuts, je faisais juste le test du handler sur cette page pour l'instant)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Security;
    using System.Web.Security;
     
    public partial class extranet : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            MembershipUser mbuser;
            mbuser = Membership.GetUser(User.Identity.Name);
     
            if (User.Identity.IsAuthenticated)
            {
                Page.Title = "Edition des pages par " + User.Identity.Name;
                HyperLink3.NavigateUrl = "~\\downloadPdf.ashx?file=" + Request.QueryString["file"];
     
            }
            else
            {
                Page.Title = "Page sécurisée - Login nécessaire";
                FormsAuthentication.RedirectToLoginPage();
            }
        }
    }
    Les liens placés sur ma page extranet.aspx seront chargés dynamiquement depuis ma base de données afin de leur donner la propriété "NavigateUrl" appropriée vers mes fichiers téléchargeables.

    Voilà, c'est pour l'instant aussi simple que ça, même s'il faudra paufiner tout ça...

  12. #12
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Citation Envoyé par penchu Voir le message
    il faudra paufiner tout ça...
    Sans aucun doute car ton contrôle d'identification doit se faire dans le handler sinon je peux appeler l'url directement pour obtenir les fichiers. A vérifier que l'information User.Identity.IsAuthenticated soit disponible à ce stade.
    "Winter is coming" (ma nouvelle page d'accueil)

  13. #13
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 156
    Par défaut
    Donc, en gros tu me conseilles de rajouter cette partie de code en plus dans mon handler?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    MembershipUser mbuser;
            mbuser = Membership.GetUser(User.Identity.Name);
     
            if (User.Identity.IsAuthenticated)
            {
                Page.Title = "Edition des pages par " + User.Identity.Name;
                HyperLink3.NavigateUrl = "~\\downloadPdf.ashx?file=" + Request.QueryString["file"];
     
            }
            else
            {
                Page.Title = "Page sécurisée - Login nécessaire";
                FormsAuthentication.RedirectToLoginPage();
            }

  14. #14
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Plutot un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public void ProcessRequest(HttpContext context)
    {
        if (context.User.Identity.IsAuthenticated)
        {
            var r = context.Response;
            try
            {
                if (HttpContext.Current.Request.QueryString["file"] != null)
                {
                    var file = HttpContext.Current.Request.QueryString["file"].ToString();
                    r.AddHeader("Content-Disposition", "attachment; filename=" + file);
                    r.WriteFile(Path.Combine("~\\PDF", file));
                }
     
            }
            catch (Exception ex)
            {
                context.Response.Redirect("Error.aspx?err=301");
                r.Flush();
                context.Response.Write("Error downloading file..<br/>Detail:<br/>" + ex.Message);
            }
        }
        else
        {
            FormsAuthentication.RedirectToLoginPage();
        }
    }
    A tester, j'ai fait que copier coller
    "Winter is coming" (ma nouvelle page d'accueil)

  15. #15
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 51
    Par défaut
    En principe, il faudrait même vérifier les droits de l'utilisateur par rapport au fichier non ?
    Bon, je suppose que tu vas avancer sur le code mais en tout cas, je pense que tu es sur la bonne voie pour faire ça simplement.

  16. #16
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Citation Envoyé par PascalL67 Voir le message
    En principe, il faudrait même vérifier les droits de l'utilisateur par rapport au fichier non ?
    Assurément si on considère
    Citation Envoyé par penchu Voir le message
    pouvoir voir les fichiers disponibles pour lui.
    Car en l'état il suffit d'être identifié pour avoir accès à tout.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  17. #17
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 156
    Par défaut
    Bonjour tout le monde,

    je fais un peu suite à mon premier problème qui est résolu (sans trop de sécurité pour l'instant, mais ça viendra).

    J'ai rajouté un composant TreeView dans ma page qui va en fait parcourir l'arborescence de dossiers dans un répertoire FTP. (un dossier par utilisateur).

    Le problème que je n'arrive pas à résoudre, c'est comment mettre le chemin relatif du fichier en tant que lien dans chaque noeud enfant du TreeView (en gros, si un noeud enfant est un fichier, il faut pouvoir l'ouvrir en cliquant dessus).
    Le problème se situe lorsque j'affecte la propriété NavigateUrl des noeuds de mon TreeView.
    Je récupère bien le nom de mon fichier à chaque fois, mais je dois lui assigner son chemin relatif ainsi que son nom afin qu'on puisse le télécharger (via le handler précédemment mis en place).

    Voici le code complet de ma page dans laquelle j'ai mis le composant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Security;
    using System.Web.Security;
    using System.IO;
     
    public partial class extranet : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            MembershipUser mbuser;
            mbuser = Membership.GetUser(User.Identity.Name);
     
            if (User.Identity.IsAuthenticated)
            {
                Page.Title = "Edition des pages par " + User.Identity.Name;            
            }
            else
            {
                Page.Title = "Page sécurisée - Login nécessaire";
                FormsAuthentication.RedirectToLoginPage();
            }
     
            if (Page.IsPostBack == false)
            {
                System.IO.DirectoryInfo RootDir = new System.IO.DirectoryInfo(Server.MapPath("~\\PDF"));
     
                // output the directory into a node
                TreeNode RootNode = OutputDirectory(RootDir, null);
     
                // add the output to the tree
                Tv_fichiers.Nodes.Add(RootNode);
            }
        }
     
        TreeNode OutputDirectory(System.IO.DirectoryInfo directory, TreeNode parentNode)
        {
            // validate param
            if (directory == null) return null;
     
            // create a node for this directory
            TreeNode DirNode = new TreeNode(directory.Name);
     
            // get subdirectories of the current directory
            System.IO.DirectoryInfo[] SubDirectories = directory.GetDirectories();
     
            // output each subdirectory
            for (int DirectoryCount = 0; DirectoryCount < SubDirectories.Length; DirectoryCount++)
            {
                OutputDirectory(SubDirectories[DirectoryCount], DirNode);
            }
     
            // output the current directories files
            System.IO.FileInfo[] Files = directory.GetFiles();
     
            for (int FileCount = 0; FileCount < Files.Length; FileCount++)
            {
                TreeNode newNode = new TreeNode(Files[FileCount].Name);
                newNode.NavigateUrl = "~\\downloadPdf.ashx?file=" + Files[FileCount].Name;
                DirNode.ChildNodes.Add(newNode);
            }
     
            // if the parent node is null, return this node
            // otherwise add this node to the parent and return the parent
            if (parentNode == null)
            {
                return DirNode;
            }
            else
            {
                parentNode.ChildNodes.Add(DirNode);
                return parentNode;
            }
        }
    }
    Cette solution vous semble-t-elle correcte, cohérente et utilisable facilement?
    N'y a-t-il pas une méthode plus simple?

    Merci d'avance

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Accès fichiers Internet
    Par joujou_le_fou dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/08/2004, 12h49
  2. [tomcat]acces fichier dans contexte
    Par krollette dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 23/01/2004, 14h17
  3. pb service NT / accès fichier
    Par gord's dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 24/07/2003, 17h20
  4. [Kylix] accés fichiers
    Par sdoura dans le forum EDI
    Réponses: 4
    Dernier message: 08/10/2002, 19h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo