1 - "Menu dinamico problematico" , habia preguntado como hacer un
menu que se ajuste a los roles o permisos de usuarios. En resumen la
respuesta era usar una combinacion de la seguridad de .net con sitemap
y site navigation. Enlace del post:
2 - en el post "Menu Dinamica Problematico - Parte 2": pregunte a
cerca de como ponerle seguridad a eso debido a que si bien el menu se
armaba en forma dinamica basado en el usuario, pero un usuario anonimo
que escribia en forma manual la URL podia ver una pagina no
autorizada. En resumen, la respuesta era configurar la seguridad
del .net ya se por URL o por Archivo, definir roles de usuarios,
permisos y establecer esos permisos en el webconfig.
Eso tambien funciono sin problemas y aqui el enlacen de este post:
Aclaracion si algun link no anda: "algo que aprendi en este foro es
que Microsoft mueve constantamente sus paginas".
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Y ahora vienen las nuevas preguntas para ver si puedo finalizar mi
doctorado en Menues!
Resulta que la seguridad anterior funciona bien o relativamente bien y
es lo que quiero mejorar.
Tengo creado los roles: employees y customers.
Tambien tengo creados los usuarios: employee01 y customer01
asignandole a cada uno el rol correspondiente a su nombre.
Inicialmente coloque el siguiente codigo en el webconfig de cada sub-
folder que quiero restringir (esos web config ya se crean automaticos
cuando se usa el wizard de configuracion de .net para aginar permisos
y crear roles y usuarios):
<!-- Permiso para CUSTOMERS -->
<location path="Customers/Support.aspx">
<system.web>
<authorization>
<deny users="?" />
<allow roles="customers"/>
<allow roles="employees"/>
</authorization>
</system.web>
</location>
<!-- Permiso para EMPLOYEES -->
<location path="EmployeesOnly/Discounts.aspx">
<system.web>
<authorization>
<deny users="?" />
<deny roles="customers"/>
<allow roles="employees"/>
</authorization>
</system.web>
</location>
En verdad que este codigo no me funciono en los webconfigs de cada sub-
folder, inclusive colocandole delante el tag <configuration> y algunos
que otros cambios.
Finalmente lo coloque en el webconfig principal justo una linea antes
de finalizar el archivo, antes de </configuration> y ahi si me
funciono.
El problema es que no funciona del todo bien por ejemplo:
- Cuando ingreso como usuario anonimo -> solo puedo ver las paginas
autorizadas por el y si intento escribir manualmente una URL no
autorizada me re-direcciona automaticamente a la pagina de Login.
- Lo mismo sucede con el usuario employee01, que solo puede ver de
acuerdo al permiso que tiene.
- Y lo mismo para el usuario customer01.
- El problema es que Cuando entro con el usuario employee01 y accedo a
una URL que no esta permitida para un usuario anonimo, puedo hacer un
copy / paste de esa URL, posteriormente hago un logout y quedo como
usuario anonimo, ahi es donde pego la URL que copie del usuario
employee01 y si lo accedo, y esto no deberia pasar.
Es decir que la restriccion anda bien, sino tuviera dos tipos de
usuarios diferentes en el mismo computador.
Entonces, alguien me podria explicar como mejorar esto o que hice mal?
Agradezco la ayuda.
Perdon por el post medio largo, quizas sirva para usuarios con los
mismo problemas que yo.
Saludos
Marcos
Espero que sea eso
Avisanos
_______________________
Jose A. Fernandez
On 22 mayo, 12:15, marcosjr...@gmail.com wrote:
> Hola Gente:
> Bueno aca voy con mi tercer pregunta relacionada al tema de menues
> dinamicos.
> Como para hacer un repaso:
> En el post:
>
> 1 - "Menu dinamico problematico" , habia preguntado como hacer un
> menu que se ajuste a los roles o permisos de usuarios. En resumen la
> respuesta era usar una combinacion de la seguridad de .net con sitemap
> y site navigation. Enlace del post:
>
> http://groups.google.com.ar/group/microsoft.public.es.dotnet.aspnet/b...
>
> 2 - en el post "Menu Dinamica Problematico - Parte 2": pregunte a
> cerca de como ponerle seguridad a eso debido a que si bien el menu se
> armaba en forma dinamica basado en el usuario, pero un usuario anonimo
> que escribia en forma manual la URL podia ver una pagina no
> autorizada. En resumen, la respuesta era configurar la seguridad
> del .net ya se por URL o por Archivo, definir roles de usuarios,
> permisos y establecer esos permisos en el webconfig.
>
> Eso tambien funciono sin problemas y aqui el enlacen de este post:
>
> http://groups.google.com.ar/group/microsoft.public.es.dotnet.aspnet/b...
Entonces que hago???
Marcos
Pero tambien cuando idearon el protocolo http envia dentro del
encabezado del mismo estas directivas del cache.
Si por codigo colocas en el codebehind (en el load de la pagina)
Response.Cache.SetCacheability(HttpCacheability.NoCache)
(Nota: aqui si lees el codigo dice que: NoCache no envía la directiva
de solicitud HTTP 1.0 común Pragma: no-cache. entonces yo hacia por
las dudas y haciendo caso casi reliogoso ;) a
http://support.microsoft.com/default.aspx?scid=kb;es-es;234067
Entonces en el Page_Load
Response.AddHeader("Pragma", "no-cache")
Aqui directamente escribo en el
Pero en la respuesta en el encabezado HTTP es:
Server: ASP.NET Development Server/8.0.0.0
Date: Wed, 23 May 2007 18:02:03 GMT
X-AspNet-Version: 2.0.50727
Cache-Control: no-cache, no-store
Pragma: no-cache
Expires: -1
Content-Type: text/html; charset=utf-8
Content-Length: 520
Connection: Close
200 OK
Como veras envia los datos de:
Cache-Control: no-cache, no-store
Pragma: no-cache
Expires: -1
PERO NO ME FUNCIONABA :S, porque los nevagadores no se como
implementaran (Eso era con IE5.5 e IE6) ahora con el IE7 parece que
bien y con el FF mas aun.
Pero bueno tendrias que verificarlo. PEro si el usuario ve la pagina y
quiere hacer algo INDUDABLEMENTE no podra realizarlo porque la terea
requiere ir al servidor.
Sintesis
------------------
Para realizar esto mismo por directiva de pagina es;
<%@ OutputCache Location="None" VaryByParam="None" %>
Para lo mismo, pero por codebehind:
Response.Cache.SetCacheability(HttpCacheability.NoCache)
(esto envia en el encabezado http como te dije)
o para colocar cualquier "atributo" en el encabezado http
Response.AddHeader("Pragma", "no-cache")
Response.AddHeader("cache-control", "private")
vaa cualquier cosa puedes colocar y luego recuperarla
Response.AddHeader("unEjemplo", "valor")
Tambien a nivel web.config (esto no lo probe pero deshabilita todo el
cache)
<outputCache enableOutputCache="false"></outputCa
che>
(tendriamos que ahondar mas en esta configuracion)
O en paginas HTML en el Header como
<META http-equiv="Pragma" content="no-cache">
<META http-equiv="Expires" content="-1">
(esto tambien lo puedes agregar por
Recomedacion:
--------------------
Cuando es necesario entonces esto de no-cache coloco esto en el
codebehind de mi pagina:
Response.Cache.SetCacheability(HttpCacheability.ServerAndNoCache)
Response.Cache.SetAllowResponseInBrowserHistory(False)
Response.Cache.SetNoStore()
(...)
Cuando HttpCacheability se establece en NoCache o ServerAndNoCache, el
encabezado HTTP Expires se establece de forma predeterminada en -1, lo
que indica al cliente que no almacene las respuestas en la carpeta
Historial de la memoria caché; de esta manera, cada vez que se
utilicen los botones atrás y adelante, el cliente solicita una nueva
versión de la respuesta. Puede reemplazar este comportamiento llamando
al método SetAllowResponseInBrowserHistory con el parámetro allow
establecido en true.
Si HttpCacheability se establece en valores distintos de NoCache o
ServerAndNoCache, llamar al método SetAllowResponseInBrowserHistory
con cualquier valor de allow no tiene ningún efecto.
(...)
y cuando me dice "No tiene ningun efecto" ES ASI jeje
Antes... usaba mucho todo esto:
Response.Expires = -15
Response.ExpiresAbsolute = Date.Now.AddMinutes(-15)
Response.AddHeader("pragma", "no-cache")
Response.AddHeader("cache-control", "private")
Response.CacheControl = "private"
Pero me daba cuenta de que con algunas elementos sobraban
Enlaces:
----------------
HttpResponse.Cache (Propiedad)
Obtiene la directiva de caché (caducidad, privacidad, cláusulas de
variación) de una página Web.
http://msdn2.microsoft.com/es-es/library/system.web.httpresponse.cache(VS.80).aspx
Establecer el almacenamiento en caché de una página
http://msdn2.microsoft.com/es-es/library/w9s3a17d(VS.80).aspx
HttpCachePolicy.SetAllowResponseInBrowserHistory (Método)
Hace que la respuesta esté disponible en la caché de historial del
explorador del cliente, independientemente del valor de
HttpCacheability especificado en el servidor, cuando el parámetro
allow es true.
http://msdn2.microsoft.com/es-es/library/system.web.httpcachepolicy.setallowresponseinbrowserhistory(VS.80).aspx
HttpCacheability (Enumeración)
NoCache, Private, Public, Server, ServerAndNoCache, ServerAndPrivate
http://msdn2.microsoft.com/es-es/library/system.web.httpcacheability(VS.80).aspx
Cómo a caché utilizando Visual Basic .NET en ASP.NET
(que magnifica traduccion para: How To Cache in ASP.NET by Using
Visual Basic .NET .. no te parece?)
http://support.microsoft.com/kb/811431/es
part of Hypertext Transfer Protocol -- HTTP/1.1 - RFC 2616 Fielding,
et al.
14 Header Field Definitions
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
Espero que te sirva de ayuda o guia
___________________________
Jose A. Fernandez
- Primero muchas gracias por tu respuesta!
- Esta muy clara tu explicacion fuera de que para gente principiante
como yo todo esto es un mundo nuevo, pero se entendio muy bien!
- No hay puntuacion 6 estrellas sino la colocaria por la respuesta que
explica muy bien los porque y una breve resenia historica.
- Voy a revisar bien los links que me envias, al igual que el codigo y
las sugerencias (como siempre hago) y posteriormente te cuento y
coloco aqui como me fue para que le sirva a todos!
- cuando termine con esto, se viene la parte 4 de mi pregunta con
condimentos nuevos :) y con todo esto y tus respuestas creo que voy a
poder terminar sin problemas mi DOCTORADOR EN MENUS.
Saludos,
Marcos
200 OK
le puse este codigo, en el evento load de la pagina nomas
Protected Sub Page_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Load
Response.Cache.SetCacheability(HttpCacheability.NoCache)
End Sub
Si tenes comentarios extras de este tema avisame!
Saludos,
Marcos