Archivo de la etiqueta: ASP.NET

HttpAntiForgeryException en ASP.NET MVC

Hola a todos, gracias a Jose María Aguilar hoy he resuelto un pequeño problema con ASP.NET MVC de esos de los que te pegas dos días loco.

La cosa se puede reproducir muy fácilmente creando un nuevo proyecto MVC tal cual nos lo genera Visual Studio 2012:

        MVC Default Project         

Si la ejecutamos directamente  nos aparecerá la web por defecto totalmente funcionando. Ahora, vamos a registrar un nuevo usuario, y nos mantendremos logados.

Para reproducir el error que me ha vuelto loco sólo tenemos que deslogarnos, hacer clic en login y logarnos. Una vez logamos le damos al botón del navegador para que vaya a la página anterior, y veremos que se mantiene el nombre de nuestro usuario:User Logged

Y la gracia está en que si escribimos nuestro password y nos logamos obtenemos un bonito error:

Server Error in '/' Application.


The provided anti-forgery token was meant for user "", but the current user is "juanma".

             Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Web.Mvc.HttpAntiForgeryException: The provided anti-forgery token was meant for user "", but the current user is "juanma".
Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[HttpAntiForgeryException (0x80004005): The provided anti-forgery token was meant for user "", but the current user is "juanma".]
   System.Web.Helpers.AntiXsrf.TokenValidator.ValidateTokens(HttpContextBase httpContext, IIdentity identity, AntiForgeryToken sessionToken, AntiForgeryToken fieldToken) +234369
   System.Web.Helpers.AntiXsrf.AntiForgeryWorker.Validate(HttpContextBase httpContext) +71
   System.Web.Helpers.AntiForgery.Validate() +80
   System.Web.Mvc.ValidateAntiForgeryTokenAttribute.OnAuthorization(AuthorizationContext filterContext) +22
   System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor) +96
   System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__1e(AsyncCallback asyncCallback, Object asyncState) +446
   System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
   System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) +302
   System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__17(AsyncCallback asyncCallback, Object asyncState) +30
   System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
   System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state) +382
   System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
   System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +317
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +15
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__2(AsyncCallback asyncCallback, Object asyncState) +71
   System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +249
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +50
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.17929            

 Simplemente precioso.

Es un problema de la caché,  y es que el forgery-token se guarda información relativa a la sesión que hemos iniciado con el servidor, entre ellas el usuario logado. Al ser una petición GET el navegador intenta obtener ese token de la caché, pero el servidor se da cuenta de que ese token ha sido cargado de la caché del navegador y no ha sido generada en la petición actual, por lo que, para evitar ataques de Cross-Site Request Forgery, nuestro servidor (que es muy listo) dice: eh!, ¿a donde te crees que vas?

La solución para que el navegador no nos cargue ese token (y otras cosas) en las peticiones GET que hagamos cuando queremos logarnos es indicarlo en nuestro método de login. En un proyecto MVC4 por defecto, ese método está en la clase AccountController.cs

 [AllowAnonymous]
 public ActionResult Login(string returnUrl)
 {
    ViewBag.ReturnUrl = returnUrl;
    return View();
 }

¿Cómo se lo indicamos?, añadiendo el atributo OutputCache de la siguiente manera:

 [AllowAnonymous]
 [OutputCache(NoStore = true, Duration = 0)]
 public ActionResult Login(string returnUrl)
 {
    ViewBag.ReturnUrl = returnUrl;
    return View();
 }

Si recompilamos y ejecutamos repitiendo el proceso de logarnos, navegar a la página anterior con el botón del navegador y haciendo clic en Login, ya no nos aparece el nombre de nuestro usuario anterior, sino que aparece vacío y podemos logarnos sin ningún problema y sin excepciones

Espero que os haya gustado y de nuevo tengo que darle las gracias a Jose María Aguilar por su ayuda 🙂

ASP.NET Web API (Parte 1)

Hace poco anuncié la release de ASP.NET MVC 4 Beta. ASP.NET MVC4 es una actualización con un montón de nuevas características. Una de las características que más me gustan es el soporte para crear "Web APIs". En este post es el primero de unos cuantos en los que veremos cómo aprovecharnos de esta nueva funcionalidad. Sigue leyendo

Windows Azure

Como algunos ya sabréis he pasado la mayor parte del tiempo de los últimos 6 meses trabajando en Windows Azure - que es la plataforma en la nube de Microsoft (Continúo liderando los equipos que han creado ASP.NET, partes del nucleo de .NET y VS, y algunos productos más). Sigue leyendo

Actualización disponible para ASP.NET desde el Jueves 29 de Diciembre

Hace unos días MicrosofT publicó un boletín de seguridad anunciando que se iba a publicar una actualización de seguridad para una vulnerabilidad de ASP.NET.

La actualización MS11-100 está disponible a través de Windows Update, del Windows Server Update Service y como descarga en el centro de descargas de Microsoft.

La actualización resuelve un problema que permite realizar ataques de denegación de servicio (DoS) presente en todas las versiones de ASP.NET. No se han detectado ataques en ninguno de nuestros clientes usando este exploit, pero recomendamos que se aplique la actualización lo antes posible. Sigue leyendo

Aprende Windows Azure el Martes 13 de Diciembre

Como algunos ya sabéis, he estado estos últimos seis meses trabajando en Windows Azure - la plataforma de la nuve de Microsoft (Seguiré trabajando en ASP.NET, .NET, VS y en otros productos).

El próximo Martes 13 de Diciembre estaré en un evento para desarrolladores Learn Windows Azure. En el evento podrémos aprender qué nos ofrece Windows Azure. Podéis asistir tanto en persona(en el campos de Microsoft en Redmond) como en streaming. Ambas opciones son totalmente gratuitas. Sigue leyendo

Mejoras del editor de CSS en Visual Studio

Este es el séptimo de una serie de post sobre ASP.NET 4.5

Las próximas releases de .NET y Visual Studio incluyen un montón de nuevas características. Con ASP.NET 4.5 veremos mejoras realmente increíbles tanto en Web Forms como en MVC, así como en el núcleo de ASP.NET en el que se sustentan ambas tecnologías.

En el post de hoy veremos algunas de las mejoras que traerá Visual Studio que hacen del trabajo con CSS y CSS3 se más sencillo en proyectos ASP.NET Sigue leyendo

Nuevo soporte de Empaquetado y Minificación (ASP.NET 4.5)

Este es el sexto de una serie de post sobre ASP.NET 4.5

Las próximas releases de .NET y Visual Studio incluyen un montón de nuevas características. Con ASP.NET 4.5 veremos mejoras realmente increÍbles tanto en Web Forms como en MVC, así como en el núcleo de ASP.NET en el que se sustentan ambas tecnologías.

En el post de hoy veremos el resultado del trabajo que estamos haciendo para incluir soporte de empaquetado y minificación en ASP.NET- que hace más fácil mejorar el rendimiento de nuestras aplicaciones. Esta característica se puede usar en todas las aplicaciones ASP.NET, tanto en Web Forms como en MVC. Sigue leyendo

ImageResizer una pequeña joya

El número de paquetes disponibles en el sitio NuGet se está empezando a llenar. Os recomiendo que le echéis un vistazo de vez en cuando para ver qué cosas nuevas van apareciendo, seguro que encontráis algo que os pueda ser útil.

Hoy vamos a ver un pequeño pero útil paquete del que Bertrand Le Roy se ha hecho eco hace poco para poder reescalar imágenes de forma sencilla en ASP.NET. El paquete es ImageResizer. Sigue leyendo

Model Binding Parte 3: Actualización y Validaciones (Serie ASP.NET vNext)

Este es el quinto de una serie de post que estoy haciendo sobre ASP.NET vNext.

La próxima release de Visual Studio incluye un montón de nuevas características de edición de código (de las que hablaré también en el futuro).

Este post es el tercero de tres en el que hablamos sobre el nuevo soporte de Model Binding en Web Forms. Model Binding es una extensión del sistema de databinding de ASP.NET Web Forms , y ofrece un paradigma de acceso a datos centrados en el código. Hace uso de un montón de conceptos de binding que introdujimos con ASP.NET MVC - y los integra en el modelo de controles de servidor de Web Forms. Sigue leyendo

Nuevo sitio web beta.asp.net

Aunque aún esté en fase beta, ya podemos ir echando un vistazo al nuevo sitio que nos tiene preparados los chicos de ASP.NET.

En http://beta.asp.net podemos ver cómo va a ser. El diseño aún está en proces, pero como son unos impacientes ya quieren empezar a enseñarlo. Pero la cosa no va solo de diseño, también han mejorado la organización y la navegación esperando que sea mucho más fácil de encontrar la información que buscamos. También han puesto un sitio para proponer mejoras, insultos y demás. Sigue leyendo

Habilitar HTML5 en nuestras herramientas

¿Aún no has hecho nada con HTML 5? ¿Y a qué estas esperando? Desde el SP1 de Visual Studio y de Expression Web 4 podemos hacerlo. En el post de hoy veremos cómo podemos configurar nuestras herramientas para empezar a usar HTML 5 como target de nuestros desarrollos web.

Sigue leyendo

Model Binding Parte 2: Filtrando datos (Serie ASP.NET vNext)

Este es el cuarto de una serie de post que estoy haciendo sobre ASP.NET vNext.

La próxima release de Visual Studio incluye un montón de nuevas características de edición de código (de las que hablaré también en el futuro). En el post de hoy veremos algunas pequeñas mejoras que incrementarán un montón la productividad con el editor de HTML a la hora de hacer las tareas más comunes.

Este post es el segundo de tres en el que hablamos sobre el nuevo soporte de Model Binding en Web Forms. Model Binding es una extensión del sistema de databinding de ASP.NET Web Forms , y ofrece un paradigma de acceso a datos centrados en el código. Hace uso de un montón de conceptos de binding que introdujimos con ASP.NET MVC - y los integra en el modelo de controles de servidor de Web Forms.

En el primer post de Model Binding vimos las bases sobre selección de datos. En el post de hoy vamos a ver cómo podemos filtrar datos previamente seleccionados basandose en la entrada de usuario, mientras mantenemos una visión de acceso a datos centrada en código. Veremos cómo podemos usar filtros con entrada de datos y valores obtenidos de un control dropdownlist. Sigue leyendo

Model Binding Parte 1: Seleccionando datos (ASP.NET vNext)

Este es el tercer post de la serie que estoy haciendo sobre ASP.NET vNext.

Las releases vNext de .NET  y Visual Studio incluyen toneladas de nuevas características y capacidades. Con ASP.NET vNext veremos un montón de mejoras tanto en Web Forms  como en MVC - y también en el núcleo sobre el que están construidos.

El post de hoy es el primero de tres post en los que hablaremos sobre el nuevo soporte de Model Binding que vendrá en Web Forms. Model Binding es una extensión del sistema de databinding de ASP.NET Web Forms , y ofrece un paradigma de acceso a datos centrados en el código. Hace uso de un montón de conceptos de binding que introdujimos con ASP.NET MVC - y los integra en el modelo de controles de servidor de Web Forms. Sigue leyendo

Controles de datos fuertemente tipados (Serie ASP.NET vNext)

Este es el segundo de la serie de post sobre ASP.NET vNext  que estoy haciendo.

Las releases vNext de .NET  y Visual Studio incluyen toneladas de nuevas características y capacidades. Con ASP.NET vNext veremos un montón de mejoras tanto en Web Forms  como en MVC - y también en el núcleo sobre el que están construidos.

El post de hoy es el primero de unos cuantos en el que hablaremos sobre algunas mejoras que van a venir en Web Forms. Veremos el nuevo soporte de controles de datos fuertemente tipados. Sigue leyendo

Smart Task y generacion de manejadores de eventos en el editor HTML (Serie ASP.NET vNext)

Este es el primero de una serie de post que voy a hacer sobre ASP.NET vNext.

La próxima release de Visual Studio incluye un montón de nuevas características de edición de código (de las que hablaré también en el futuro). En el post de hoy veremos algunas pequeñas mejoras que incrementarán un montón la productividad con el editor de HTML a la hora de hacer las tareas más comunes.

En particular, Visual Studio incluirá la opción de activar "smart tasks" en los controles de servidor de ASP.NET, y también permitirá conectar fácilmente manejadores de eventos a dichos controles - incluso sin tener que cambiar a la vista de diseño. A partir de ahora disponemos de estos escenarios también en la vista de código. Sigue leyendo

Serie sobre ASP.NET vNext

En los próximos meses trabajaré en una serie sobre las nuevas características que vendrán en las próximas versiones de ASP.NET y Visual Studio. Contienen un montón de nuevas funcionalidades y mejoras - tanto para Web Forms como para MVC - que pienso que os gustarán, y que hacen la creación de aplicaciónes más fácil, rápido y mejor.

Actualizaré esta página con enlaces a los posts individuales de la serie.

 - Smart Task y generacion de manejadores de eventos en el editor HTML (Serie ASP.NET vNext)

- Controles de datos fuertemente tipados

- Model Binding Parte 1: Seleccionando datos

Model Binding Parte 2: Filtrando datos

- Model Binding Parte 3: Actualización y validaciones.

- Nuevo soporte de Empaquetado y Minificación.

- Mejoras del editor de CSS en Visual Studio

Espero que sirva,

Scott.

Traducido por: Juan María Laó Ramos.