ASP.NET 5 – Integrate dependency injection

Hace días que tenía preparada esta entrada, pero entre el revuelo del Build y todas las novedades que se prometían, tenía guardado este artículo en la recámara por si anunciaban alguna novedad sobre el tema.

InjectionHasta ahora para hacer inyección de dependencias en nuestras aplicaciones web, teníamos que utilizar librerías de terceros como (Unity, Autofac, Ninject, etc), pero a partir de ahora ASP.NET 5 traerá incorporado su propio contenedor de dependencias.

Este contenedor es una versión ligera, pero nos aporta soporte completo de la pila del proceso web. Se puede acceder a los servicios en el startup, en los middleware, en los filtros, en los controladores, en el model binding,  etc. Sigue leyendo

Web And Cloud Tour 2015

Este comienzo de año a sido uno de los más activos en las comunidades desde que tengo el placer de participar, siempre se solían acumular para finales de año y este han comenzado a un ritmo muy fuerte.

Como casi no he podido hacer otra cosa haré un pequeño resumen:

Marzo

Web & Cloud Tour 2015:

Este año Microsoft decidió dar un tour por las comunidades que normalmente no suelen ser las elegidas para estos eventos. Techdencias se encargo de organizar el evento para la gente de Barcelona. Ha sido una gran experiencia que espero que se repita !!

WP_20150327_002 WP_20150327_004 WP_20150327_006 Twitter8dbac76

Microsoft MVP Open Day:

Este año Microsoft nos dio la oportunidad de ir a Palma para hacer la reunión de los MVP de España, Italia y Portugal. Aprovechando este viaje Techdencias montó un evento para el grupo local «netSaimada» de .NET. Sigue leyendo

[Truco] ASP.NET MVC & Enums

Hace mucho que no escribía nada en el blog y tengo que empezar a coger otra vez la rutina y nada mejor para eso que comenzar con un truquito para utilizar en nuestros desarrollos en ASP.NET MVC.

Como buen truco no me voy a enrollar demasiado en las explicaciones ni teorías  y me voy a centrar más en el código para que se pueda utilizar de una manera simple.

El Problema

Imaginemos que tenemos un modelo de datos que utiliza una enumeración.

public class Persona
    {
        public int Id { get; set; }
        public string Nombre { get; set; }
        public int Edad { get; set; }
        public Genero Genero { get; set; }
    }
    public enum Genero
    {
        Hombre,
        Mujer,
        Geek
    }

Una vez tenemos nuestra entidad Genero el controlador y las vistas de forma automática con Visual Studio para no entretenerme mucho con el ejemplo. De esta manera ya lo tengo todo preparado con un solo click.

Nuestra vista de inserción tendría esta pinta:

VistaInicial

Como se puede observar la vista se ha creado perfectamente para añadir nuevas personas, pero no se a mapeado correctamente la enumeración para seleccionar el sexo de la persona.

Si lo intentáramos bindar directamente con el modelo tendríamos igualmente el problema porque no sabe mapear la enumeración directamente.

Sigue leyendo

Vistas & View Engines en ASP.NET MVC

Partiendo de que la intención de MVC es separar las responsabilidades de cada componente, me gustaría explicar cual es la responsabilidad de las vistas y como utilizarlas en ASP.NET MVC.

Lo que primero nos choca a los programadores que procedemos de los formularios web, es que han desaparecido los eventos y el famoso ciclo de vida, y eso se debe precisamente que ASP.NET MVC es mucho más natural en los protocolos HTTP y HTML en su tratamiento.

Mvc vs WebForms

Como se puede apreciar en la imagen los formularios web se basaban en los eventos para procesar una petición, entrar en el ciclo de vida del documento, tratar el evento, pintar los controles y devolver el resultado.

Sin embargo las peticiones en MVC son mucho mas simples y respetuosas con el protocolo HTTP. La petición la recibe el motor de rutas que mediante la URL decide cual es el controlador que la debe procesar, el Controlador puede consultar al modelo si es necesario y posteriormente  devuelve un ActionResult  que puede ser un fichero, datos en formato JSon, una vista, etc. Sigue leyendo

¡Enhorabuena MVP de Microsoft 2011!

MVP

Despues de tantos años participando en las comunidades intentando compartir mi granito de arena me ha llegado el famoso email de Microsoft .

Enhorabuena. Nos complace presentarle el programa de nombramiento MVP de Microsoft® de 2011. Este nombramiento se concede a los líderes excepcionales de la comunidad técnica que comparten de forma activa su experiencia de alta calidad y de la vida real con otras personas. Le agradecemos especialmente la contribución que ha realizado en las comunidades técnicas en el área de ASP.NET a lo largo del pasado año.

Para mí es un placer recibir este reconocimiento por parte de Microsoft y no hace más que animarme a continuar con mi empeño de poder compartir mis experiencias y aprender de tantas otras de mis pares.

No se si es una promesa o una amenaza pero seguiré intentando aportar todo lo que pueda como lo he estado haciendo todos estos años.

Muchas gracias a todos los que me habéis apoyado durante todo este tiempo y a todos los MVP’s nuevos y a los que habéis renovado para este año.

Gracias a Todos !!

Perfiles de Usuarios ASP.NET & MVC

Una de las dudas más habituales en los foros de ASP.NET, es como mantener una variable disponible para un usuario. Lo primero que se nos puede pasar por la cabeza es utilizar la sesión para guardar esta información, pero desde ASP.NET 2.0 tenemos otras alternativas más adecuadas para estas cosas y además nos puede servir tanto para usuarios anónimos, como para usuarios autentificados.

!! No tenemos que utilizar la sesión para todo !!!  tanto nos sirve para ASP.NET como para ASP.NET MVC

Usuarios autentificados.

Una vez el usuario se ha autentificado, se asocia el perfil a la identidad del usuario en el contexto actual system.web.httpcontext.user

Usuarios anónimos

El perfil para los usuarios anónimos no está habilitada de forma predeterminada y hay que especificarlo de forma explícita.

Para poder tener estas propiedades del perfil habilitadas para los usuarios anónimos ASP.NET crea una cookie donde se establece una identidad única para el usuario y poderlo identificar cada vez que el usuario acceda a la página web. Esta cookie tiene una caducidad de 70 días y se renueva automáticamente cuando el usuario accede al sitio.

Si necesitamos controlar cuando un usuario pasa de ser anónimo a usuario autentificado, podemos controlar este paso en el momento que el usuario se autentifica y se lanza el evento MigrateAnonymous incluido en el fichero Global.asax.

Tipos Soportados

Si no se especifica el tipo del dato que queremos mantener, por defecto esta propiedad se guardara como string, pero podemos guardar tipos escalares (texto, números, fechas) tan solo especificando el tipo en la configuración de la propiedad. Sigue leyendo

GridView Custom Edit

Este año ha sido mucho más productivo de lo que me esperaba y el que comienza parece que me va a deparar nuevos retos personales que espero sean lo más positivos posible.

Para empezar con buen pie y no cejar en mis artículos técnicos, hoy haré un nuevo ejemplo práctico para personalizar un control GridView, permitir editar sus elementos con JavaScript y enviar al servidor de manera asíncrona solo las modificaciones realizadas.

Realmente cada vez existen más controles que nos permiten mejorar la experiencia de usuario y potencian usabilidad de los usuarios. Pero con un poco de tiempo es posible dar este toque a los controles con los que trabajamos cotidianamente.

Para comenzar esta práctica crearemos un nuevo proyecto web y cargaremos una grid con la base de datos NorthWind que no puede faltar en cualquier ejemplo que utilice una base de datos SQL.

Para poder editar la grid lo que tenemos que hacer primero es marcar las celdas que se podrán editar con una propiedad llamada «editable»,  guardar el nombre del registro para tenerlo a mano a la hora de guardar las modificaciones y agregar el evento onmousedown para que llame a la función javaScript de edición tanto en IE como en Firefox. Sigue leyendo

¿Existe la columna con DataReader?

En mi empresa desde un principio hemos utilizado una herramienta propia para generar la capa de lógica de negocios, adaptada  al 100% a nuestras necesidades  y que ha ido creciendo con el tiempo. Eso nos ha beneficiado en tener controlado en todo momento nuestros objetos de negocio y nos ha evitado tener que hacer un salto obligatorio para utilizar alguno de los ORM que existen en el mercado, como puede ser: Entity Framework, NHibernate, etc.

Nuestra capa de acceso a datos “DAL” encapsula toda la lógica de conexiones a datos independientemente del proveedor y hay una de las funciones que retorna un lector de datos para poder personalizar la lectura de los datos desde la capa de lógica de Negocios.

/// <summary>
/// Ejecuta el comando creado y retorna el lector.
/// </summary>
/// <returns>El resultado de la consulta.</returns>
public DbDataReader EjecutarConsulta(string cmd, CommandType tipo)
{
   this.comando.CommandText = cmd;
   this.comando.CommandType = tipo;
   this.Conectar();
   return this.comando.ExecuteReader();
}

Eso facilita la carga del objeto de negocio y optimiza la lectura.

DbDataReader reader = null;
Using (Dal dal = new Dal())
{
  string command = "select id, nombre, descripcion from productos";
  reader = dal.EjecutarConsulta(command, CommandType.Text);
  while (reader.Read())
  {
    ...

Pero uno de los problemas habituales que nos encontraremos con el objeto DataReader es que si no nos gusta leer los datos por posición, como es mi caso y preferimos controlar la columna que deseamos leer. Nos podemos encontrar con el horrible error que no se encuentra la columna que estamos intentando leer.

Ya podemos intentar validar si el objeto es null, pero no funciona:

O si el dato está vacio:

Para poder validar si la columna que estamos consultando existe podemos tener una función en nuestro DAL que valide esta situación utilizando el propio esquena de la tabla:

public bool ValidarColumna( DbDataReader reader, string nombreColumna)
{
   reader.GetSchemaTable().DefaultView.RowFilter =
     "ColumnName= '"  + nombreColumna + "'";

   return (reader.GetSchemaTable().DefaultView.Count > 0);
}

Finalmente cuando queramos hacer la consulta de los datos utilizaremos el validador para evitar errores no controlados en el acceso a datos.

using (Dal dal = new Dal())
{
   string command = @"select id, nombre, descripcion
       from productos";

    reader = dal.EjecutarConsulta(command, CommandType.Text);

    while (reader.Read())
    {
      ProductoData produc = new ProductoData();
      produc.ID = (dal.ValidarColumna(reader, "ID")
        && reader["ID"] != DBNull.Value)?(int)reader["ID"]:0;

      produc.Nombre = (dal.ValidarColumna(reader, "Nombre")
        && reader["Nombre"] != DBNull.Value)
        ?reader["Nombre"].ToString():string.Empty;

      listaProductos.Add(produc);
    }
}

Es una forma un poco rebuscada, pero no conozco ninguna otra forma de verificar esta información.

Espero que os sea útil.

 

 

Ejemplo inyección XSS + Material

Toda una experiencia el paso por el CodeCamp y una de las sesiones fue mi introducción a las buenas prácticas para defenderse de los
ataques XSS.

Un tema como este es difícil concentrarlo en 60 minutos y se me quedaron muchos ejemplos en el tintero.

Para empezar podéis bajaros la presentación y la web de pruebas que realicé para poder probar las diferentes técnicas XSS en el siguiente link.

streaming Material streaming Video streaming PPT

Ahora terminaré uno de los ejemplos que me parece muy interesante y no pude realizar por falta del valioso tiempo.

Ejemplo de XSS indirecto para robar la información del usuario:

1.URL vulnerable al ataque:

A la url se le pasa el nombre de la revista y el la foto.

2. La página:

Muestra la información directamente sin validar los datos y es vulnerable a la inyección de código script y HTML.

3. Fichero JS:

Como el ataque que planteamos es bastante elaborado necesitaríamos introducir muchos texto en la url, y por ese motivo
utilizaremos un recurso externo como un fichero JS para realizar el ataque. Sigue leyendo

Tip/Trick: DataBinding to Generics

Después de publicar algunos artículos y tener que enlazar  muchos datos en mis ejemplos ASP.NET echaba de menos poder hacer un enlace simple a mis controles ASP.NET sin tener que hacer clases y luego hacer una lista de las mismas para poder utilizar el DataSource sin problemas.

Para hacer un enlace normal,  lo primero tenemos que hacer es un objeto personalizado y luego utilizar una lista genérica para el enlace a datos.

Ejemplo uso normal con un tipo anónimo:

var Item = new { Key = 1, Value = "Coche" };
var Lista = (new[] { Item }).ToList();
Lista.Add(new { Key = 2, Value = "Moto" });

DataList1.DataSource = Lista;
DataList1.DataBind();

Luego en nuestro control  enlazado a datos  ASP.NET  tenemos el enlace al origen del registro: Sigue leyendo