webForumDet fria alternativet

Hur skydda en hel mapp med asp.net?

.NET

8 svar · 515 visningar · startad av weedogt

Medlem sedan mars 200427 inlägg
Frågan#1

Hej,

Jag håller på att bygga en sajt där en area ska vara skyddad med lösenord, ungefär www.minsida.se/skyddad/hemligsida.aspx

Med asp.net är det enkelt att skapa en login sida som skyddar hemligsida.aspx. Så långt allt väl.

Men på hemilgsida.aspx vill jag också ha lite bilder som också ska skyddas. Bilderna ligger i samma mapp, ungefär www.minsida.se/skyddad/bild.jpg

Problemet är att den enkla asp.net login metoden inte verkar funka för andra filtyper än .aspx. Hur skyddar jag ALLA filer i en mapp så att en icke inloggad användare hamnar på inloggningssidan istället för att se bilden?

Om det är av intresse: Jag har köpt min sajt av www.web10.se

/anders

Medlem sedan apr. 2004778 inlägg
#2

Finns en artikel om det på http://aspnet.4guysfromrolla.com/articles/020404-1.aspx
Artikeln pratar om Access databasfiler men du kan använda samma teknik för .jpg, .gif eller vad du nu behöver.

Medlem sedan mars 200427 inlägg
#3

Tack för tipset men...

I artikeln står det "...you will need access to Web server..." vilket är mitt problem; jag har inte access till servern. Jag måste (tror jag...) lösa det via asp.net kod och det har jag inte lyckats få svar på hur man gör.

/anders

Medlem sedan apr. 2004778 inlägg
#4

Går inte.
Då får du lägga filerna i en mapp ovanför wwwroot så att de inte är tillgängliga via webben. Sedan får dina .aspx sidor öppna filerna genom att använda System.IO.

Medlem sedan jan. 2004501 inlägg
#5

En problem ställning. Om jag nu har ett webhotell. Hur fixar man det då?

Medlem sedan mars 200427 inlägg
#6

PDahlen skrev:

Går inte.
Då får du lägga filerna i en mapp ovanför wwwroot så att de inte är tillgängliga via webben. Sedan får dina .aspx sidor öppna filerna genom att använda System.IO.

Ok, det kan funka. Det gick bra att skapa en mapp ovanför wwwroot.

Jag har nu sökt på webben men inte funnit någon mer exakt information om hur jag kan använda system.io för att visa en bild som ligger ovanför wwwroot.

Kanske någon kan peka mej i rätt riktning?

/anders

Medlem sedan apr. 2004778 inlägg
#7

Rättar mig själv lite. För bilder använder du System.Drawing.Imaging.
Men i övrigt så kan du läsa på om t.ex. System.IO på MSDN.

Här är ett exempel som jag använder för att visa bilder:

Skapa ett nytt .aspx dokument, t.ex. ShowImage.aspx
I code-behind Page_Load lägger du

  'Read in the image filename to create a thumbnail of
  Dim imageID As String = Request.QueryString("fileid")
  Dim imageUrl As String
  ' imageUrl brukar jag hämta i databas
  ' men här tar jag en url som jag skickat in
  imageUrl = Request("bild")

  'Get the image.
  Try
    'Make sure that the image URL doesn't contain any /'s or \'s
    If imageUrl.IndexOf("/") >= 0 Or imageUrl.IndexOf("\") >= 0 Then
      'We found a / or \
      Response.End()
    End If

    'Add on the appropriate directory
    ' här måste man ange hela sökvägen till bilden
    ' mappen ligger utanför wwwroot som finns i
    ' c:/inetpub/wwwroot/
    imageUrl = "c:/inetpub/minabilder/" & imageUrl

    Dim fullSizeImg As System.Drawing.Image
    fullSizeImg = System.Drawing.Image.FromFile(Server.MapPath(imageUrl))
    Dim imgType = fullSizeImg.RawFormat

    If imgType.Equals(System.Drawing.Imaging.ImageFormat.Gif) Then
      Response.ContentType = "image/gif"
    Else
      Response.ContentType = "image/jpeg"
    End If

    fullSizeImg.Save(Response.OutputStream, imgType)
  Catch
    ' här hamnar vi om bilden vi försökte öppna inte finns
    ' då tar jag en bild som jag vet finns, t.ex. en bild
    ' som det står "Bild saknas" på 
    imageUrl = "~/images/no_image.gif"
    Dim fullSizeImg As System.Drawing.Image
    fullSizeImg = System.Drawing.Image.FromFile(Server.MapPath(imageUrl))
    Dim imgType = fullSizeImg.RawFormat
    If imgType.Equals(System.Drawing.Imaging.ImageFormat.Gif) Then
      Response.ContentType = "image/gif"
    Else
      Response.ContentType = "image/jpeg"
    End If

    fullSizeImg.Save(Response.OutputStream, imgType)
  End Try

När du sedan ska visa en bild så skapar du en asp:Image och lägger ImageUrl="showimage.aspx?bild=minbild.jpg"

Medlem sedan dec. 19991 072 inlägg
#8

En problem ställning. Om jag nu har ett webhotell. Hur fixar man det då?

Det går alldeles utmärkt. Du får helt enkelt koppla asp.net motorn till de filtyper du vill skydda. Detta görs i web.config:

	
<location path="HEMLIG_MAPP">
    <system.web>      
		<httpHandlers>
			<add verb="*" path="*.jpg" type="My_NS.My_Class,My_NS" />			
		</httpHandlers>
    </system.web>
  </location>

Din klass (My_Class) får du sedan ärva ner från "IHttpModule" och sedan i metoden kolla att användaren verkligen är Inloggad.

Exempel på detta finns bla. på:
http://msdn.microsoft.com/asp.net/using/building/web/default.aspx?pull=/library/en-us/dnaspp/html/urlrewriting.asp#urlrewriting_topic7

PDahlen: I ditt kodexempel där du kollar efter "Sökvägs-tecken", tänk på att HEX-tecken även fungerar och att du bör skydda dig mot dessa med.

Medlem sedan mars 200427 inlägg
#9

PDahlen skrev:

Här är ett exempel som jag använder för att visa bilder:

Tack PDahlen! Efter ett par timmars strulande med ditt exempel som bas fick jag det att funka som jag ville. Kalas!

261 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)