try practices net handling exceptions example custom catch best asp asp.net exception

practices - Extraña excepción no controlada desde la aplicación asp.net-La validación de viewstate MAC falló



throw custom exception c# (6)

¿tiene varios servidores ejecutando esta aplicación y / o tiene un jardín web? En caso afirmativo, tendrá que configurar la clave del equipo en la web.config

No sé si alguien ha visto este problema antes, pero estoy perplejo. Aquí está el mensaje de excepción no controlada que está capturando mi página de error.

Mensaje de error: la validación de viewstate MAC falló. Si esta aplicación está alojada en una Web Farm o clúster, asegúrese de que la configuración especifique la misma validationKey y el mismo algoritmo de validación. AutoGenerate no se puede usar en un clúster.

Stack Trace: en System.Web.UI.ViewStateException.ThrowError (Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError) en System.Web.UI.ObjectStateFormatter.Deserialize (String inputString) en System.Web.UI.ObjectStateFormatter.System .Web.UI.IStateFormatter.Deserialize (String serializedState) en System.Web.UI.Util.DeserializeWithAssert (formateador IStateFormatter, String serializedState) en System.Web.UI.HiddenFieldPageStatePersister.Load () en System.Web.UI.Page. LoadPageStateFromPersistenceMedium () en System.Web.UI.Page.LoadAllState () en System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) en System.Web.UI.Page.ProcessRequest (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) en System.Web.UI.Page.ProcessRequest () en System.Web.UI.Page.ProcessRequestWithNoAssert (contexto de HttpContext) en System.Web.UI.Page.ProcessRequest (contexto de HttpContext) en ASP.generic_aspx.ProcessRe quest (HttpContext context) en System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () en System.Web.HttpApplication.ExecuteStep (paso IExecutionStep, Boolean & completedSynchronously)

Fuente: System.Web

¿Alguien tiene alguna idea sobre cómo puedo resolver esto? Gracias.


De forma predeterminada, ASP.NET incluye una firma digital del valor ViewState en la página. Lo hace con una clave generada automáticamente que se guarda en la memoria. Esto se hace para evitar que un usuario malicioso altere ViewState desde el navegador y, por ejemplo, otorgue acceso a cosas a las que normalmente no tendrían acceso.

ASP.NET también puede, opcionalmente, encriptar el ViewState, pero está desactivado por defecto por razones de rendimiento. En muchos sitios web, es mucho más importante asegurarse de que el contenido de ViewState no esté ''sucio'', que mantenerlo confidencial.

El mensaje de error dice que la verificación de la firma falló. La página se publicó con un ViewState, pero la firma de ViewState no coincidía con la firma calculada con las claves en poder del servidor.

La razón más común de este error es que está utilizando dos o más servidores web en un entorno de tipo granja de servidores: un servidor envía la página original, firmada con la clave en la memoria en ese servidor, pero la página se publica en el segundo (o tercero ...) servidor. Debido a que los dos o más servidores no comparten la clave de firma, las firmas no coinciden.

... Si esta aplicación está alojada en una Web Farm o clúster, asegúrese de que la configuración especifique la misma validationKey y el mismo algoritmo de validación. AutoGenerate no se puede usar en un clúster.

Lo que el mensaje de error le está diciendo es usar el atributo validationKey ( ver detalles en MSDN ) en su web.config para codificar la clave de firma con un valor compartido por todos sus servidores, en lugar de usar uno generado dinámicamente. De esta forma, la validación de la firma puede tener éxito independientemente de qué servidor reciba la devolución de datos.

Puede desactivar la verificación, pero es muy peligroso hacerlo. Significa que cualquier pirata informático con un poco de tiempo libre puede falsificar valores en su aplicación. Por ejemplo, si mantiene el precio del artículo en un valor de ViewState, el pirata informático podría cambiar el valor del navegador a $ 0,01 justo antes de realizar el pedido.


Me parece recordar que este error puede ocurrir si hace clic en un botón / enlace, etc., antes de que la página se haya cargado por completo.

Si este es el caso, el error es causado por una característica de ASP.net 2.0 llamada Validación de eventos. Esta es una función de seguridad que garantiza que las acciones de devolución de datos solo provengan de eventos permitidos y creados por el servidor para ayudar a evitar devoluciones automáticas falsas. Esta característica se implementa al tener los controles registrar eventos válidos cuando se procesan (como en, durante sus métodos Render () reales). El resultado final es que en la parte inferior de la etiqueta del formulario procesado, verá algo como esto:

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="AEBnx7v.........tS" />

Cuando se produce una devolución de datos, ASP.net utiliza los valores almacenados en este campo oculto para garantizar que el botón en el que hizo clic invoca un evento válido. Si no es válido, obtienes la excepción que has estado viendo.

El problema que está viendo ocurre específicamente cuando se realiza una devolución de datos antes de que se haya procesado el campo EventValidation. Si EventValidation está habilitado (lo cual es, de forma predeterminada), pero ASP.net no ve el campo oculto cuando se realiza la devolución, también obtiene la excepción. Si envía un formulario antes de que se haya procesado por completo, es probable que el campo EventValidation aún no se haya procesado y, por lo tanto, ASP.net no puede validar su clic.

Por supuesto, una alternativa es simplemente desactivar la validación de eventos, pero debe tener en cuenta las implicaciones de seguridad. Alternativamente, simplemente nunca publique antes de que el formulario haya terminado de renderizar. Por supuesto, eso es difícil de decirles a los usuarios, pero ¿quizás podrías inhabilitar la interfaz de usuario hasta que se haya procesado el formulario?

de http://forums.asp.net/p/955145/1173230.aspx


Sé que puede deshabilitar la Validación de viewstate MAC, pero creo que si la página no está cargada, puede tener más problemas. Cuando me encontré con este problema tuve que deshabilitar todos los botones hasta que la página se cargó por completo.