Avatar billede hlt Juniormester
29. maj 2019 - 13:50 Der er 12 kommentarer og
2 løsninger

Begræns adgang til filer i bestemt mappe

Hej,
Jeg har brug for at begrænse adgang til en mappe på et website for brugere som ikke er logget ind i websitet.
Jeg har lavet en web.config fil til at ligge i mappen, hvor jeg giver adgang til bestemte grupper, og hvis man ikke er logget ind, skal man ikke kunne hverken se eller åbne de filer der ligger i mappen. Det virker tildels også fint, bortset fra at hvis man kender navnet på det dokument man vil åbne, så kan man godt få adgang til at læse det i browseren, ved at taste hele url'en. Men hvis man bare taster mappe navnet, vil man blive nægtet adgang.
Så hvordan kan jeg lukke adgang til filerne, hvis man ikke er logget ind?
På forhånd tak
Avatar billede arne_v Ekspert
30. maj 2019 - 00:04 #1
Er der dynamiske web sider a la .aspx filer eller er det andre filer a la .docx, .pdf etc.?
Avatar billede arne_v Ekspert
30. maj 2019 - 03:02 #2
Hvad har du lagt ind i web.config nu?
Avatar billede hlt Juniormester
30. maj 2019 - 14:01 #3
Det er kun .docx, PDF osv der ligger i mappen.
Min web.config fil ser sådan ud:
<?xml version="1.0"?>
<configuration>
  <system.web>
    <authorization>
      <allow roles="admin"/>
      <allow roles="user"/>
      <deny users="?" />
    </authorization>
  </system.web>
</configuration>
Jeg har prøvet at lave en location="mappenavn", men det virkede ikke rigtigt. Der var flere eksempler på nettet. En hvor location stod som en selvstændig linie, men også en hvor den havde indholdet under sig <location path=xxxx><system.web>.....</location>
Men den fik serveren til at fejle. Den hvor den stod som en selvstændig linie under <system.web> fejlede ikke. Og virkede fint, hvis man altså kun tastede mappe navnet. Men hvis man taster hele urlen til dokumentet, så kan man sagtens åbne det, selvom det ligger i den mappe man altså ikke har adgang til.
Avatar billede arne_v Ekspert
30. maj 2019 - 22:01 #4
Jeg har en mistanke om at problemet er at de filer serves direkte af IIS udenom ASP.NET - og web.config bruges kun af ASP.NET.

Hvis det er rigtigt så er der 2 muligeheder:
1) Få konfigureret IIS til at goere det rigtige
2) Flytte filerne udenfor IIS traet og have en download.ashx i directory som styrer adgangen til disse filer
Avatar billede hlt Juniormester
31. maj 2019 - 01:55 #5
Jeg tænkte lidt i den sidste retning. Kunne man lave et eller andet som du skriver, med en .net fil, som styrer visningen, men hvor det der står i urlen er en anden sti end den hvor dokumentet ligger?
Avatar billede arne_v Ekspert
31. maj 2019 - 03:13 #6
Ja.

En download.ashx som kaldes med:

/mappe/download.ashx?file=foobar.pdf

som saa streamer indholdet af \andenmappe\foobar.pdf tilbage til browser med korrekt content type.
Avatar billede hlt Juniormester
31. maj 2019 - 13:00 #7
Jeg tænkte bare at der måske var en løsning hvor man kunne lave lidt ala en urlrewrite... Bare et quickfix. Jeg må se om jeg kan finde et eksempel på en ashx fil
Avatar billede hlt Juniormester
31. maj 2019 - 15:42 #8
Nu har jeg prøvet at finde et eksempel, og det er tilsyneladende ikke så nemt. Jeg fandt et, men hvor det var en alm. .cs fil, men hvor man skulle ændre en hel del i config filen. Og det virkede ikke rigtigt. Hvis jeg lavede eksemplet, kom der en fejl, med at serveren ikke kunne loade filen. Så det opgav jeg. Men jeg synes det er lidt mærkeligt at der ikke er nogen der har siddet med samme problem?
Du skulle vel ikke ligge inde med noget kode til ashx filen?
Avatar billede arne_v Ekspert
31. maj 2019 - 18:48 #9
Jeg laver lige et eksempel.

Men foerst om nogle timer. Jeg har en graesplaene som venter.  :-)
Avatar billede arne_v Ekspert
31. maj 2019 - 19:02 #10
Naa skidt pyt. Jeg lavede den lige.


<%@ WebHandler Language="C#" Class="E.Download" %>

using System;
using System.Web;

namespace E
{
    public class Download : IHttpHandler
    {
        private const string LOCATION = @"C:\work\";
        public void ProcessRequest (HttpContext ctx) {
            string fnm = ctx.Request["file"];
            ctx.Response.ContentType = "application/octet";
            ctx.Response.Headers.Add("Content-Transfer-Encoding", "binary");
            ctx.Response.Headers.Add("Content-Disposition", "attachment; filename=" + fnm);
            ctx.Response.TransmitFile(LOCATION + fnm);
        }
        public bool IsReusable
        {
            get { return true; }
        }
    }
}


http://hostname/download.ashx?file=foobar.zip

henter C:\work\foobar.zip
Avatar billede hlt Juniormester
31. maj 2019 - 19:08 #11
Hej igen,
Jeg tror dælme jeg fik det til at virke. Jeg skal lige rette det lidt til. Men jeg tror det virker. Giver lige en tilbagemelding. God fornøjelse med græsplænen :-)
Avatar billede hlt Juniormester
31. maj 2019 - 22:49 #12
Tak for din kode. Jeg nåede ikke at skrive, inden du havde lagt det op. Men jeg fik det til at virke. Jeg fandt langt om længe noget kode der kunne bruges. Skulle jo så lige spores ind på hvad det var jeg skulle have.
Jeg kigger din kode igennem. Men tusind tak for hjælpen. Jeg ville gerne give point, men det er man gået bort fra?? Det er lang tid siden jeg har været på eksperten :-)
Avatar billede arne_v Ekspert
01. juni 2019 - 01:05 #13
Af sikkerhedsgrunde skal koden nok se ud som:


<%@ WebHandler Language="C#" Class="E.Download" %>

using System;
using System.Net;
using System.Web;

namespace E
{
    public class Download : IHttpHandler
    {
        private const string LOCATION = @"C:\work\";
        public void ProcessRequest (HttpContext ctx) {
            string fnm = ctx.Request["file"];
            if(fnm.Contains("..") || fnm.Contains("/"))
            {
                ctx.Response.StatusCode = (int)HttpStatusCode.Forbidden;
                return;
            }
            ctx.Response.ContentType = "application/octet";
            ctx.Response.Headers.Add("Content-Transfer-Encoding", "binary");
            ctx.Response.Headers.Add("Content-Disposition", "attachment; filename=" + fnm);
            ctx.Response.TransmitFile(LOCATION + fnm);
        }
        public bool IsReusable
        {
            get { return true; }
        }
    }
}
Avatar billede arne_v Ekspert
01. juni 2019 - 01:05 #14
Men stadig meget meget simpel kode.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester