Hola Mariano
LA solucion mas rapida y simple...que la utilizo

Proteccion de archivos:
---------------------------
Colocar tus archivos en una ubicacion protegida (fuera del directorio del
website podria ser si tiene acceso al disco completo), pero si no puedes en
fuera del website, podrias en una carpeta protegida con autorizacion de
asp.net
Es por un lado para proteger.
     <location path="~/recursos/archivos/">
               <system.web>
                       <authorization>
                               <allow  users="[lista de usuarios separados
por comas]"
                                       roles="[lista de funciones separadas
por comas]"/>
                               <deny   users="[lista de usuarios separados
por comas]"
                                       roles="[ lista de funciones
separadas por comas]"/>
                               </authorization>
               </system.web>
       </location>
Esto en el web.config general por eso de location o tambien puedes en
archivo webconfig que contenga solamente este sectgor en la carpeta
  <configuration>
   <system.web>
       <authorization>
           <deny users=...

HAsta ahi tienes protegido, te puede servir si por ejemplo tienes un grupo
de descarga para los archivos o simplementa uusarios autenticados solamente
puedan descargar

Pero si necesitas tener un control mas estricto de la descarga, tendras que
implementar lo que te comenta Diego

Ahora veamos el tema de la descarga
----------------------------------------
Por lo que comentas son archivos fisicos (es decir no estan en la db, ni
tampoco lo estas creando on fly), o sea puedes leerlo mediante codigo,
entonces aqui tienes dos opciones

 A) Leerlos en un objeto FileStream (colo el enlace mas abajo) y luego
 B) Escribir directamente en la respuesta HTTP (dependiendo de cual grande
sea los archivos)
De las dos opciones mas abajo coloco los codigo de ejemplo de unos
proyectos, creo que te pueden servir

La idea es mostrar como quieras los archivos (desde la DB, leyendo el
directorio y mostrando las propiedades como ser nombre, tamaño) pero que el
visitante no sepa donde estas ubicados.
Cuando quiera descargar tendras que realizar uno de los dos opciones y
tambien (si miras el codigo) cambiar el ContentType de la cabecera HTTP que
como sabras para que el browser sepa que hacer.




Enlaces que te pueden servir:
--------------------------------
FileStream (Clase)
Expone un objeto Stream alrededor de un archivo; se admiten operaciones de
lectura y escritura sincrónica y asincrónica.
http://msdn2.microsoft.com/es-es/library/system.io.filestream(VS.80).aspx

HttpResponse.WriteFile (Método)
Escribe el archivo especificado directamente en la secuencia de salida de
una respuesta HTTP.
http://msdn2.microsoft.com/es-es/library/system.web.httpresponse.writefile(VS.80).aspx

Handling Custom File Downloads in ASP.NET With Server Controls
http://www.eggheadcafe.com/articles/20011006.asp

Downloading Files - Forcing the File Download Dialog
http://aspalliance.com/259

Force download
http://www.dotnetspider.com/kb/Article1802.aspx



OPCION A: Codigo de descarga
---------------------------------
 Public Sub Descargar(ByVal archivoPath As String, ByVal archivoNombre As
String)

       Try
           Dim fullPath = Path.GetFullPath(archivoPath)
           Dim name = archivoNombre
           Dim ext = Path.GetExtension(fullPath)
           Dim type As String = ""
           If Not IsDBNull(ext) Then
               ext = ext.ToString.ToLower
           End If

           Response.Clear()
           Response.ClearContent()
           Response.ClearHeaders()

           Select Case ext
               Case ".pdf"
                   type = "Application/pdf"
               Case ".htm", ".html"
                   type = "text/HTML"
               Case ".txt"
                   type = "text/plain"
               Case ".doc", ".rtf"
                   type = "Application/msword"
               Case ".csv", ".xls"
                   type = "Application/x-msexcel"
               Case ".mp3", ".mpeg", ".mp2", ".wav", ".avi", ".dat",
".jpg", ".swf", ".jpeg", ".bmp"
                   type = "application/octet-stream"
               Case ".exe"
                   type = "application/octet-stream"
               Case Else
                   type = "text/plain"
           End Select

           Dim streamArchivo As IO.FileStream
           streamArchivo = IO.File.Open(fullPath, IO.FileMode.Open)
           Dim getContent(streamArchivo.Length) As Byte
           streamArchivo.Read(getContent, 0, streamArchivo.Length)
           streamArchivo.Close()
           Response.AddHeader("content-disposition", "attachment;
filename=" + name)
           If type <> "" Then
               Response.ContentType = type
           End If
           Response.BinaryWrite(getContent)
           Response.End()

       Catch ex As Exception
           '...obtengo el error
       End Try

   End Sub


OPCION B:
----------------

    string path = archivoFullPath;
    context.Response.AppendHeader("content-disposition", "attachment;
filename=" + archivoNombre);
   context.Response.ContentType = type;
   context.Response.WriteFile(path);


Espero que te sirva de ayuda o guia
______________________
Jose A. Fernandez






On 7/16/07, Leonardo Micheloni <[EMAIL PROTECTED]> wrote:

Se me ocurre que no necesariamente los archivos tienen que estar en
una dirección, es decir, podés crearlos on the fly. O sea, el usuario
se conecta y le listás lo que puede bajar, cuando hace click lees el
archivo (desde el origen, un disco, o BD) y lo escribís con el
correspondiente content etc en una nueva página para que lo pueda
descargar.
La otra opción es la que dice Diego, puede ver la url pero el
HttpModule no lo deja acceder.

Saludos,
Leonardo.

On 7/16/07, Mariano Minoli <[EMAIL PROTECTED]> wrote:
>
>
>
> Buenas lista,
>
>
>
> Necesito implementar una página que liste archivos (disponibles en un
ftp)
> de acuerdo al usuario que esté logueado, permita descargarlos. La
cuestión
> es que no quiero dejar los archivos disponibles en un directorio virtual
del
> estilo:
>
>
>
> http://misitio.com/archivos/usuario123.pdf
>
> http://misitio.com/archivos/usuario124.pdf
>
> http://misitio.com/archivos/usuario125.pdf
>
> http://misitio.com/archivos/usuario126.pdf
>
>
>
> Porque otros podrían ver la url e inferir la url de los archivos de otro
> usuario, descargando información que no les corresponde.
>
>
>
> Se les ocurre alguna solución que permita descargar archivos y que no
> permita que otro usuario, escribiendo la url, acceda a los archivos que
no
> le corresponde ??
>
>
>
> Desde ya muchas gracias.
>
>
>
>
>
> Mariano Minoli
>
>  ________________________________
> Be a better Globetrotter. Get better travel answers from someone who
knows.
> Yahoo! Answers - Check it out.




--

Responder a