Cómo usar bundles y minificados

ASP.NET 4.5 viene con una característica muy buena llamada bundles y minificados. Son dos técnicas que permiten unificar nuestros archivos en uno solo y reducir su peso renombrando variables y quitando comentarios y espacios en blanco innecesarios.

El primer paso es crear los bundles. Para esto debemos buscar el archivo App_Start\BundleConfig.cs. En la función RegisterBundles, debemos realizar la configuración:

La función Include permite especificar todos los archivos que incluye el bundle. Simplemente se ingresan todos separados por coma.

El wildcard {version} permite que podamos actualizar el número de versión y ASP.NET va a tomar siempre el más grande si necesidad de cambiar el código.

También se puede hacer con CSS:

Para mostrar los bundles en nuestras vistas:

Para activar el bundling y la minificación no hay que olvidarse de cambiar la siguiente propiedad en el web.config:

Si no cambiamos debug a false, nuestro HTML se generará con toda la lista de referencias a los archivos que incluyen nuestros bundles. Por ejemplo:

En cambio, con debug en false, se genera un único archivo (un bundle), minificado y además, se agrega un parámetro aleatorio para evitar que el browser cachee los archivos.

archivo minificado

Adicionalmente, si debug está en false, ASP.NET va a buscar la versión .min de los archivos, si es que ya existe.

Para mayor información, recomiendo este artículo: https://docs.microsoft.com/en-us/aspnet/mvc/overview/performance/bundling-and-minification

ASP.Net WCF: The service cannot be activated because it does not support ASP.NET compatibility

Estuve dando vueltas con este error desde ayer y fue algo que, ciertamente, me hizo perder mucho tiempo.

El error surge por una falta de conocimiento en la forma en que trabaja WCF y ASP.NET cuando corren dentro del mismo sitio.

WCF y ASP.NET puede correr side-by-side pero se debe habilitar el modo de compatibilidad. Si no se hace, va a aparecer el mensaje de error del título:

The service cannot be activated because it does not support ASP.NET compatibility

Ahí se nos invitará a modificar la propiedad aspNetCompatibilityEnabled a false. Pero esto no resuelve las cosas totalmente porque habrá cosas en nuestro servicio WCF que no funcionarán como esperamos.

El problema que estaba teniendo yo al hacer esto es que HttpContext.Current me estaba devolviendo siempre null en mi servidor de pruebas (IIS Express). En el servidor de producción (AWS) funcionaba bien.

El problema aquí es que el servicio no se estaba activando bien. Para esto hay que seguir los siguientes pasos:

1. En primer lugar, la propiedad aspNetCompatibilityEnabled tiene que estar en true en el web.config:

2. En segundo lugar, hay que importar el siguiente namespace:

3. Y, por último, hay que decorar la clase de nuestro servicio de la siguiente manera:

De esta forma podremos acceder a HttpContext.Current sin problemas.

Para más información sobre este tema, recomiendo este post de Microsoft: WCF Services and ASP.NET.

Autenticación de usuarios con ASP.NET

ASP.NET ofrece tres mecanismos de autenticación: Windows, Passport y Formularios. De estos tres me voy a dedicar a explicar autenticación con formularios en detalle y voy a hacer un breve comentario sobre los otros dos.

La autenticación Windows permite al programador delegar la responsabilidad de la autenticación a Windows y al sistema de archivos NTFS, aprovechando también las funcionalidades de seguridad integradas en IIS. Normalmente, cuando un cliente realiza una petición a una páginas ASP.NET o a un web service, estas peticiones son manejadas por IIS. Si configuramos la autenticación en modo “Windows”, IIS delegará la tarea al sistema operativo. El usuario será autenticado en base a las credenciales que proveyó cuando inició sesión en Windows.

La autenticación Passport utiliza un servicio centralizado provisto por Microsoft. Para utilizar Passport hay que registrarse en el servicio, aceptar el acuerdo de licencia, pagar la cuota del servicio e instalar el SDK de Passport.

Finalmente, el método del cual vamos a hablar con mayor detalle es autenticación por formularios. Este método ofrece muchas ventajas al desarrollador, siendo la flexibilidad una de las más importantes. Será responsabilidad del desarrollador diseñar el formulario de inicio de sesión, implementar algún tipo de repositorio para las credenciales de usuario y realizar la validación contra ese repositorio, entre otras cosas.

Para utilizar autenticación por formularios es necesario realizar la siguiente configuración en el archivo web.config:

Noten que puede haber, además de esto, otras configuraciones actualmente presentes en el web.config.

Con esto, lo que hemos hecho es:

  1. Definir el modo de autenticación.
  2. Denegar la autorización de acceso a los usuarios anónimos (simbolizados con el signo “?”).

Veamos ahora cómo realizar una autenticación sencilla siguiendo los siguientes pasos:

1.Creemos una página de inicio Default.aspx simple, para validar el ejemplo.

2.Creemos una página de login sencilla como la siguiente:

3.Utilicemos el siguiente code-behind:

Con este ejemplo, y el web.config que comentamos antes, debería redirigirnos a la página Login.aspx cuando quisiéramos acceder a nuestra Default.aspx.

Otros parámetros del tag <form> son los siguientes:

  • protection: indica si la aplicación debe usar validación, encriptación, ninguno o ambos métodos para proteger la cookie. El valor predeterminado es All, que utiliza ambos métodos. None indica ningún método. Encryption utiliza Triple-DES para encriptar la cookie y Validation especifica que se valide la información leída en la cookie antes de utilizarla.
  • timeout: expecifica el número de minutos de vida de la cookie.
  • slidingExpiration: valor true o false indicando si la cookie se refresca con cada petición. En ASP.NET 1.1, el valor predeterminad es true y en 2.0 es false.

Autenticación contra el web.config

El ejemplo anterior mostraba cómo autenticar usuarios contra datos fijos en el archivo de code-behind. Otra forma de guardar los datos de los usuarios es en el archivo code-behind.

Guardar los passwords en formato “Clear” no es lo más recomendable. Es posible también guardarlos hasheados en MD5 y SHA1. Para hashear los passwords podemos utilizar el método HashPasswordForStoringInConfigFile() de la clase FormsAuthentication.

Para autenticar de este modo debemos utilizar el método Authenticate de la clase FormsAuthentication. Autenticación contra una base de datos

Este tal vez es el método más común. En este ejemplo se trabaja con una función Authenticate dentro de la página aunque lo más frecuente es tener toda la lógica de autenticación en algún componente separado.

Redirigir a una página específica

Para redirigir a una página específica, distinta de la que podría venir en el parámetro RedirectUrl, primero enviamos la cookie y luego hacemos el redireccionamiento:

Locations

Por defecto, todos los directorios y subdirectorios, incluyendo archivos, donde se encuentre el web.config estarán protegidos al activar el mecanismo de autenticación. Si necesitamos que alguna ubicación específica tenga permisos diferentes, podemos (1) recurrir a un web.config por cada directorio o (2), mucho mejor, definir elementos en el web.config principal.