Detectar nueva session y obligar al usuario a logearse nuevamente

En una intranet desarrollada para una empresa donde trabajo se requeria que cuando el usuario cerrara su ventana actual de navegador, sin cerrar previamentre su sesion de usuario autenticado, el sistema deberia solicitarle los datos para la autenticacion, por razones de seguridad algunos gerentes cierran sus ventanas con sus credenciales pero algunas personas pueden sentarse en su maquina y seguir con las credenciales en el cache.
En este caso particular las sessiones las guardamos en un Servidor de Session.

La solucion mas rapida que encontre a este problema fue crear una clase que here de System.Web.UI.MasterPage con este codigo y luego que las demas MasterPages principales utilizadas en el sitio hereden (en este caso una sola)

Public Class YODAMasterBase
    Inherits System.Web.UI.MasterPage

    Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
        MyBase.OnInit(e)

        If (Context.Session IsNot Nothing) Then
            If (Session.IsNewSession) Then
                Dim cadenaCookieHeader As String = Request.Headers("Cookie")
                If (cadenaCookieHeader IsNot Nothing) Or (cadenaCookieHeader.IndexOf("ASP.NET_SessionId") >= 0) Then
                    FormsAuthentication.SignOut()
                    Response.Redirect("~/login.aspx?accion=demo")
                End If
            End If
        End If
    End Sub

End Class

Luego hay que heredar de estar MasterPage llamada YodaMasterPage las que necesitemos esta funcionalidad.

Partial Class EJEMPLODeMasterPage
    Inherits YodaMasterPage

Tambien podriamos preguntar si es .IsNewSession y el usuario esta autenticado .IsAuthenticated, que luego lo testeare y probare.

 

Enlaces

siteMapNode: Varias variables querystring en la url

Un caso que nos puede tocar es enviar por querystring mas de una variable, eso es simple:

http://www.empresa/pagina.asp?var1=valor1&var2=valor2

Pero cuando esto lo queremos insertar en nuestro web.sitemap y armamos el siteMapNode vemos que no es trivial… (a primera vista)

image

El error:
No se pudo cargar el archivo de configuracion de mapa del sitio XML web.sitemap; Error al analizar EntityName.

Solucion

Tenemos que utilizar las EntityName para el querido simbolo &, porque espera luego de este simbolo buscar una nombre de entidad y no lo encuentra, asi que debemos dar el nombre de la entidad & (que recursividad no? ;)….

& = &
& = &

Podemos utilizar cualquier de las formas para esta entidad:

 

<siteMapNode title=”JEDIS” url=”~/jedis/listado.aspx?var1=valor1&#38;var2=var2″ description=”” />

<siteMapNode title=”JEDIS” url=”~/jedis/listado.aspx?var1=valor1&amp;var2=var2″ description=”” />

Acentos con EntityName

Si queremos por ejemplo agregar acentos por ejemplo Ú que el código es: &Uacute; deberias escribir
Ejemplo:
        Si queremos escribir “Último JEDI”
         <siteMapNode title=”&amp;Uacute;ltimo JEDIS” url=”~/jedis/listado.aspx” description=”Ejemplo” />

Entonces en el html resultante:
         <a href=”/jedis/listado.aspx” title=”Ejemplo”>&Uacute;ltimo JEDIS</a>

 

 

Tools.Shell: REG QUERY desde ventana de comandos del VS2005. Ejemplo de Alias

Estaba leyendo el articulo de elBruno de como averiguar el número de serie de VS2005, y me acorde de como consultar el valor del registro desde la linea de comandos y tambien desde el propio VS2005 en la ventana de comandos

[VS2005] Como averiguar el nro de serie de Visual Studio ??

Por eso desde aqui te propongo:

  1. Como consulta valores del registro desde la linea de comandos (cmd.exe)
  2. Como realizar la misma consulta desde la ventana de comandos del VS2005
  3. Algunos ejemplos de uso de la comandos

 

1 – Consulta al registro

Primeramente el comando de consulta de un valor del registro

Si pedimos la ayuda del comando reg /?

image

Aqui pedimos nuevamente la ayuda

reg query /?

image

Ya tenemos la informacion que necesitamos /v ValueName para consultar un valor especifico 

Entonces la consulta completa seria

reg query HKLMSOFTWAREMicrosoftVisualStudio8.0Registration /v PIDKEY

Como no quiero estar mostrando ni el numero de serie ni el ProductId, los ejemplos que mostrare se basan en el ProductId (el mismo que aparece en el Acerca de… del VS2005) solo faltaria replicarlo para obtener el numero de serie.
Entonces nuestro ejemplo queda

reg query HKLMSOFTWAREMicrosoftVisualStudio8.0Registration /v ProductId

Salida:

! REG.EXE VERSION 3.0
HKEY_LOCAL_MACHINESOFTWAREMicrosoftVisualStudio8.0Registration
    ProductId   REG_SZ  xxxxx-xxx-xxxxxxx-xxxxx

image

 

2 – Consultar al registro desde la Ventana de comandos del Visual Studio 2005

Y para ejecutar esta sencilla linea dentro de nuestro IDE, lo hacemos en la ventana de comandos, y para ejecutar C:WINDOWSSYSTEM32REG.EXE hacemos uso de Tools.Shell

Probemos antes visualizar la ayuda, aqui esta

image

Sintaxis:

Tools.Shell [/command] [/output] [/dir:folder] path [args]

Con los parametros de Tool.Shell [/c|/command]: la salida coloca en la ventana de comandos y con [/o|/output] : en la ventana de output
Ademas tenemos que colocar “/?” entre comillas para que no detecte que sea el pedido de ayuda de la misma ventana de comandos, sino como argumento del comando.

image

y tambien en la ventana de Output

image

 

Alias

La linea de comandos soporta alias. Para Tools.Shell es shell, entonces podriamos haber escrito
>shell /c /o “REG.EXE” “/?”

 

Para consultar el valor del registro del ProductId del Visual Studio dentro del propio Visual Studio tipeamos tal cual como lo hariamos en la linea de comandos pero sin colocar los argumentos entre comillas sino simplemente el comando completo, queda asi:
>Tools.Shell /c /o REG.EXE QUERY HKLMSOFTWAREMicrosoftVisualStudio8.0Registration /v ProductId

Acuerdate que si necesitas el numero de serie del VS2005 la key es PIDKEY (mira de nuevo el articulo de elBruno)
>Tools.Shell /c /o REG.EXE QUERY HKLMSOFTWAREMicrosoftVisualStudio8.0Registration /v PIDKEY

Seguimos con el ejemplo. Para poder observar la misma salida que la linea de comandos.

 image

Tambien podriamos colocar el path completo del nuestor programa a ejecutar

>Tools.Shell /c /o C:WINDOWSSYSTEM32REG.EXE QUERY HKLMSOFTWAREMicrosoftVisualStudio8.0Registration /v ProductId

 

Para crear un alias

>alias VS2005NumSerie >Tools.Shell /c /o C:WINDOWSSYSTEM32REG.EXE QUERY HKLMSOFTWAREMicrosoftVisualStudio8.0Registration /v ProductId

image

 

 

3 – Otros ejemplos de comandos

Tambien para que nos puede servir para un ping
image

Ademas de lanzar comandos hacia el propio IDE con sus respectivos alias que nos pueden ayudar en nuestras tareas cotidianas.

  • Cerrar archivo actual: Close
    (alias close File.Close)
    Cerrar todos los archivos abiertos: CloseAll
    (alias CloseAll Window.CloseAllDocuments)
    image
  • Idem con:
    • Save
      (alias save File.SaveSelectedItems)
    • SaveAll
      (alias SaveAll File.SaveAll)
    • SaveAs
      (alias SaveAs File.SaveSelectedItemsAs)
      image
  • El viejo y querido cls
    (alias cls Edit.ClearAll)  
    image 

 

Puedes visualizar todos los alias tipeando >alias en la ventana de comando, o crear el propio.

Aqui mas Comandos de Visual Studio con argumentos y Alias de comando predefinidos de Visual Studio

Espero que les sirva de ayuda o guia…

 

Enlaces

VS2008: Training Videos

Con un compañero de trabajo estamos instalado en nuestras queridas y costosas (por lo menos para nosotros) notebooks personales la beta 2 de VS2008 (y hace unos meses descargamos la imagen virtual pero como que se nos daño unos de tantos archivos desistimos de seguir, ya volvemos a la carga.

Y me gusto ver Silverlight en accion con estos videos aqui:

image

 

 

Visual Studio 2008 Training Videos
    – Get up to speed on Visual Studio 2008
    – Client Development
    – Web Develpment
    – Data Access
    – Office Development
    – Mobile Development
    – Team Development

http://msdn2.microsoft.com/en-us/vstudio/bb655906.aspx

 

image

[OT] ¿Quién lidera las búsquedas? (Agosto 2007)… que negocio!

Gracias a esta empresa comScore tenemos el pulso en lo que a busqueda se refiere (basados en su metodología , version en PDF) donde explica tecnicamente como obtiene los resultados por cookies y cual es el problema de la eliminacion de estos archivos que implica el mismo usuario se cuenta mas de una vez y esto no es correcto, interesante para leerlo un dia de lluvia 🙂

Bueno veamos un poco los datos… nuevos Mr. G lidera ampliamente el espectro con 37 mil millones de busquedas (en Agosto de 2007) con 31MM para busquedas de Google y 5MM para YouTube

Top 10 Search Properties Worldwide* August 2007
Total World Age 15+, Home and Work Locations**
Source: comScore qSearch 2.0

image

image

* Search properties based on top 50 properties worldwide where search activity is observed. 
** Excludes traffic from public computers such as Internet cafes or access from mobile phones or PDAs.

 

Estos dos buscadores siguiendo los pasos de los legendarios… acercandose en una 3° y 5° posición.

http://www.baidu.com/ (China) sencillo
image

 

http://www.naver.com/ (Coreano)mmm un poco complicado ….

image

 

Y por casa como estamos?

image

 

Tengo poco conocimiento de esta empresa… pero parece que estos tipos de análisis dan pie para luego realizar consultorias asi que bueno, tomemos como es: “Un articulo disponible” que nos da pautas que en las busquedas hay un negocio redondo… vamos el AdSense.. je!

 

Enlaces:

comScore: 61 Billion Searches Conducted Worldwide in August
http://www.comscore.com/press/release.asp?press=1802
– Metodologia: http://www.comscore.com/method/method.asp
– PDF: The impact of cookie deletion on the accuracy of site-server and ad-server metrics:an empirical comscore study
    Dr. Magid Abraham, Cameron Meierhoefer, Andrew Lipsman, ComScore, inc.
    http://www.comscore.com/request/cookie_deletion_white_paper.pdf

RadioButtonList: Insertar llamada Javascript en ListItem

Ya sabemos utilizar facilmente el RadioButtonList pero como llamar a una funcion del lado del cliente (javascript) desde un LisItem, veamos un ejemplo

Tenemos un sencillo webcontrol RadioButtonList

<asp:RadioButtonList ID="RadioButtonList1" runat="server" >
<asp:ListItem Value="yoda">Yoda</asp:ListItem>
<asp:ListItem Value="luke">Luke Skywalker</asp:ListItem>
<asp:ListItem Value="r2d2">R2-D2</asp:ListItem>
<asp:ListItem Value="c3po">C-3PO</asp:ListItem>
</asp:RadioButtonList>
 
y un metodo a llamar en javascript
<script language="javascript" type="text/javascript">
       function mensaje(ctlOpcion){                
           alert("Opcion seleccionada: " + ctlOpcion.value);
       }        

</script>

Pero como agregamos llamada a un metodo del cliente? No tenemos a nuesta disposicion nada referente a lado del cliente
image

Entonces no nos queda mas remedio que ir al codigo…y agregarlo mediante el metodo Atributtes.Add (ya que es una coleccion)

Dim itemRadioBtn As ListItem
For Each itemRadioBtn In RadioButtonList1.Items
itemRadioBtn.Attributes.Add("onClick", "mensaje(this);")
Next
Vamos recorriendo los items de nuestro RadioButtonList y en el evento onClick (podria ser otro que necesitemos) vamos declarando la llamada a la funcion javascript.
 
Para verlo funcionar (aunque sea en imagen)
image

 

Tambien podriamos recorrer mediante javascript, una opcion seria sin conocer la cantidad de items

Veamos un script

<script language="javascript" type="text/javascript">
   1:  
   2:    function mensajeSeleccionado(ctrlOpcionesId){
   3:        alert("Opcion seleccionada:" + OpcionObtenerSeleccionada(ctrlOpcionesId))
   4:    }
   5:    
   6:    function OpcionObtenerSeleccionada(ctrlOpcionesId)
   7:        {
   8:            //Recorremos los items                   
   9:            var posicion = 0;
  10:            var item = document.getElementById(ctrlOpcionesId+"_"+posicion);    
  11:            alert(ctrlOpcionesId+"_"+posicion);                  
  12:            while(item != null){
  13:                  if(item.checked) {
  14:                    return item.value;
  15:                  } else{
  16:                    posicion += 1;
  17:                    item = document.getElementById(ctrlOpcionesId+"_"+(posicion));                                                                           
  18:                  }                        
  19:            }  
  20:        }    

</script>

 
Y lo llamamos con un enlace
<a href="javascript:mensajeSeleccionado('<%=RadioButtonList1.ClientId %>');">Ver Seleccion</a>

y enviamos el Id del lado del Cliente de nuestro webcontrol.

<a href="javascript:mensajeSeleccionado('<%=RadioButtonList1.ClientId %>', <%=RadioButtonList1.Items.Count %>);">Ver Seleccion</a>
(cabe aclarar que es mejro escribir esto desde el codigo y no inline como estamos utilizando <% %>)
Bueno y la firma de la funcion javascript seria
function mensajeSeleccionado(ctrlOpcionesId, cantidadItems){
alert("Opcion seleccionada:" + OpcionObtenerSeleccionada(ctrlOpcionesId, cantidadItems))
}

y recorrer mediante un bucle for… que te lo dejo para tarea del hogar 😉

 

Enlaces

  • RadioButtonList (Clase)
    Representa un control de lista que encapsula un grupo de controles de botón de opción.
  • ListItem.Attributes (Propiedad)
    Obtiene una colección de pares de nombre y valor de atributo para la clase ListItem que ésta no admite directamente.
  • AttributeCollection (Clase)
    Proporciona acceso de modelo de objetos a todos los atributos declarados en la etiqueta de apertura de un elemento de control de servidor ASP.NET. No se puede heredar esta clase.