none
Interdire l'accès à des ressources depuis l'URL

    Question

  • Bonjour,

    Je suis actuellement embêté sur un développement d'un site en ASP.net (frameword 4.0).

    Je dispose d'une page contenant un ensemble de vidéos lisibles grâce aux balises <video> de l'HTML5.

    Ces vidéos se trouvent dans un répertoire sur un disque et sont accessibles via un répertoire virtuel.

    Tout fonctionne parfaitement sauf qu'il est possible d'accéder pour n'importe qui aux vidéos à travers l'URL (grâce au répertoire virtuel) alors que je souhaite restreindre cette partie à certains membre uniquement (le test se fait dans le code behind de la page qui contient l'ensemble des vidéos pour n'afficher que les vidéos désirées).

    Existe-t-il une solution pour que mes vidéos soient accessibles depuis l'attribut "src" de <video> (<video src="monRepertoireVirtuel/maVideo.mp4>) et qu'elle soient inaccessibles depuis l'URL via "http://monSite/monRepertoireVirtuel/maVideo.mp4" ?

    J'ai essayé par tout les moyens (HttpHandler, ...) mais rien n'y fait...

    Pour info, je n'utilise pas le système MemberShip de l'ASP.net, donc je ne peux pas utiliser le système de rôles dans les web.config.

    J'espère trouver une solution parmi vous,

    D'avance merci beaucoup.

    mardi 1 octobre 2013 12:58

Réponses

Toutes les réponses

  • Bonjour,

    Pour info, je n'utilise pas le système MemberShip de l'ASP.net, donc je ne peux pas utiliser le système de rôles dans les web.config.
    Sans mécanisme authentification il vous sera impossible de protéger vos vidéos. Comment voulez vous faire la différence entre un utilisateur qui à le droit de voir votre vidéo et celui qui n'a pas le droit ???

    le test se fait dans le code behind de la page qui contient l'ensemble des vidéos pour n'afficher que les vidéos désirées
    Pouvez-vous nous expliquer un peu plus en détail comment vous savez les vidéos que vous devez autoriser ou refuser à l'utilisateur.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    mardi 1 octobre 2013 21:21
  • Bonjour,

    Merci pour votre réponse.

    Je travaille avec un code d'accès.

    Je connais l'identifiant du client grâce à une variable de session (je sais donc s'il est connecté ou non). Cette variable est modifiée lorsque le client passe par mon propre formulaire de connexion. En fonction de cet ID et d'une table "codeVideo", je peux vérifier que le client à demander un code pour visionner les vidéos (code valable 1h).

    Sur ma page ASP, je n'ai pas de problème puisque je peux faire ces vérifications (donc le client ne verra les vidéos que si il a entré son code). En revanche, s'il y accède par l'URL, je n'ai aucune vérification.

    Une solution testée consiste à développer un HttpHandler et de faire les vérifications dans ce handler. Ca marche très bien sauf que lorsque je veux renvoyer la vidéo au client avec "Response.TransmitFile" ou "Response.WriteFile", j'ai un gros problème au niveau du cache de mon lecteur HTML5 (il ne détecte pas la longueur de la vidéo, donc il stream au fur et à mesure) alors que mes vidéos sont physiquement présentes sur le disque. Si je n'utilise pas ce handler, ça marche parfaitement bien sûr mais je n'ai aucune vérification. Ce système de TransmitFile ne fonctionne bien évidement pas non plus sur iOS...

    Merci pour votre aide!


    mercredi 2 octobre 2013 06:44
  • Bonjour

    La solution évidente c'était de utiliser Response.TransmitFile, mais avec ces inconvénients.....
    Une autre possible solution, peut-être de travailler avec le système d'exploitation pour créer des fichiers liées pour chaque video per utilisateur:  http://msdn.microsoft.com/fr-fr/library/windows/desktop/aa364215(v=vs.85).aspx.

     N.B. Le fichier lié fonctionne seulement avec une partition NTFS, mais normalement un
    serveur utilise NTFS.

    Pour chaque utilisateur et vidéo vous créez un fichier liée, et vous avez besoin d'un service qui vas effacer ce lien après une heure.
    Je dirais que la solution sera compose par deux paries :
    1. partie Web qui enregistre une demande dans la BD
    2. Un service Windows qui gère la création et effacement des fichiers liées.
    Je vous propose cette architecture a cause des droits élevées pour la création des fichiers liées, et qui si c'est donne au IIS/ASP.NET vas poser des problèmes de sécurité.
    Je n’ai pu pas tester la solution, donc avant commencer le développement faites un petit teste avec un fichier liée crée a main.

    Cordialement,

     

    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.


    mercredi 2 octobre 2013 07:30
  • Bonjour,

    Merci pour votre réponse.

    Ce système me semble être légèrement trop lourd pour un système aussi "simple" que celui que je veux mettre en place. Le temps en développement sera bien trop long.

    J'imagine qu'il doit exister des solutions plus simplistes.

    L'idéal pour moi serait de catcher les demandes aux ressources .mp4 (format de mes vidéos) et de pouvoir faire un traitement pour soit valider la demande, soit l'annuler (avec ma fameuse table accesVideo).

    C'est ce que fait les HttpHandler, mais le problème c'est qu'il faut faire un traitement dans ces HttpHandler pour renvoyer quelque chose à l'utilisateur. 
    Or, moi j'aimerais simplement dire "OK, accède à la ressource", ou "STOP, tu n'as pas accès", sans devoir passer par un TransmitFile etc.

    PS: j'ai essayé une solution avec les redirection dans IIS sur mon répertoire virtuel. La solution fonctionne sauf que dans mon code, lorsque je fais un "src=...", il redirige également... Donc cette solution n'est pas exploitable. 

    Merci.

    mercredi 2 octobre 2013 08:14
  • Pour la solution avec HttpHandler, est que vous envoyez bien les entêtes ?

    Ça peut être un possible raison pour ne pas bien déterminer la durée de votre Vidéo.   

    Voir la réponse marquée ici:

    http://social.msdn.microsoft.com/Forums/vstudio/en-US/415f5d20-ebe7-4c2c-bc8a-40d37fdad3d7/how-to-download-video-files-from-server-using-c

    Deux autres possibles solutions:

    1. Voir les ISAPI FILTERS.

    Ici vous avez un petit exemple pour la redirection  (C++!!!):

    http://blogs.msdn.com/b/rakkimk/archive/2008/05/10/iis-sample-isapi-filter-doing-redirection-to-another-website.aspx

    2. Une autre solution peut être :

    http://www.iis.net/learn/extensions/url-rewrite-module/using-url-rewrite-module-20

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mercredi 2 octobre 2013 09:39
  • Voici mes entêtes, et elles me semblent correctes puisque la vidéo est bien transférée...

    HttpContext.Current.Response.ClearContent();
    HttpContext.Current.Response.ClearHeaders();
    FileInfo fInfo = new FileInfo("chemin_en_dur_pour_test\\1.mp4");
    HttpContext.Current.Response.ContentType = "video/mp4";
    HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("filename={0}", "1.mp4"));
    HttpContext.Current.Response.AddHeader("Content-Type", "video/mp4");
    HttpContext.Current.Response.AddHeader("Content-Length", fInfo.Length.ToString());
    HttpContext.Current.Response.Buffer = true;
    HttpContext.Current.Response.WriteFile("chemin_en_dur_pour_test\\1.mp4");
    HttpContext.Current.Response.Flush();

    Pour l'histoire des 2 autres solutions avec les filtres de redirection, j'ai déjà testé mais rien n'y fait...
    Le filtre est pris en compte avec le src="..." de la balise <video> HTML5...

    Le problème persiste...

    Vous ne connaissez aucun moyen d'annuler un HttpHandler pour le laisser faire son travail normal ?

    Merci pour votre aide.

    PS: j'ai essayé avec le buffer à true et à false.
    J'ai également essayé avec TransmitFile et WriteFile ainsi qu'avec WriteBinary.
    mercredi 2 octobre 2013 10:28
  • Mais peut-être le Handler trouve ici:

    http://videostreamer.codeplex.com/SourceControl/latest#SampleWebApplication/VideoStreamer.ashx

    A priori c'est un problème de supporter des range requetés.

    Cordialement, 



    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.


    mercredi 2 octobre 2013 11:00
  • Et un autre lien sur le même sujet:

    http://dotnetslackers.com/articles/aspnet/Range-Specific-Requests-in-ASP-NET.aspx

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mercredi 2 octobre 2013 11:22
  • Merveilleux, avec ce handler ça fonctionne parfaitement! 

    J'explique ma résolution du problème:

    • Ajouter dans IIS un mappage de scripts sur le répertoire virtuel. Ce mappage concerne l'ensemble des fichiers .mp4 avec le script aspnet_isapi.dll
    • Créer un WebHandler comme dans la citation
    • Appeler dans l'attribut src de la balise <video> ce handler

    Le problème est ainsi résolu puisque par l'URL l'accès est impossible (grâce au mappage) et par le code il l'est.

    Petit plus: ce handler fonctionne avec tout appareil iOS, super!

    Merci beaucoup pour votre aide précieuse.

    Cordialement,

    mercredi 2 octobre 2013 11:55