asp.net mvc 3 - ¿Por qué recibo el error "Se detectó un valor de Request.Form potencialmente peligroso desde el cliente"?
asp.net-mvc-3 azure (9)
A primera vista, parece un error en la biblioteca de Azure Mvc3. MVC 3 expone API especiales que le permiten recuperar valores no validados de la colección de Formularios, pero parece que el módulo no los está utilizando.
Creé un nuevo sitio ASP.NET MVC 3 / .NET Framework 4.0 utilizando la plantilla "Aplicación de Internet". Usé Nuget para instalar el paquete de rol de Windows Azure Web (MVC3) y seguí el tutorial del servicio de control de acceso para configurar Windows Live ID y la autenticación de Google.
Muy pronto, me encontré con el error "Se detectó un valor Request.Form potencialmente peligroso desde el cliente" y seguí el artículo en el wiki de Windows Identity Foundation para intentar resolverlo. Desafortunadamente, nada de lo que intenté funciona, incluyendo:
Configurando
<httpRuntime requestValidationMode="2.0"/>
y<pages validateRequest="false">
tanto en la raíz web.config como en Views / web.configCopia
SampleRequestValidator
del WIF SDK en el proyecto y configuración<httpRuntime requestValidationType="SampleRequestValidator"/>
en ambos web.configs
También probé variaciones de estos sin éxito.
¿Algunas ideas?
Aquí está la excepción completa:
Detalles de la excepción: System.Web.HttpRequestValidationException: se detectó un valor Request.Form potencialmente peligroso desde el cliente (wresult = " <t:RequestSecurityTo...
").
Descripción: La validación de solicitud ha detectado un valor de entrada de cliente potencialmente peligroso y se ha cancelado el procesamiento de la solicitud. Este valor puede indicar un intento de comprometer la seguridad de su aplicación, como un ataque de scripts entre sitios. Para permitir que las páginas anulen la configuración de validación de solicitud, configure el atributo requestValidationMode en la sección de configuración httpRuntime para requestValidationMode = "2.0". Ejemplo: <httpRuntime requestValidationMode="2.0" />
. Después de establecer este valor, puede deshabilitar la validación de solicitud configurando validateRequest = "false" en la directiva de la página o en la sección de configuración <pages>
. Sin embargo, se recomienda enfáticamente que su aplicación verifique todas las entradas en este caso. Para obtener más información, vea http://go.microsoft.com/fwlink/?LinkId=153133 .
Stack Trace:
[HttpRequestValidationException (0x80004005): se detectó un valor potencialmente potencialmente peligroso Request.Form del cliente (wresult = " <t:RequestSecurityTo...
")].
System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection) +8755668 System.Web.HttpRequest.ValidateNameValueCollection(NameValueCollection nvc, RequestValidationSource requestCollection) +122 System.Web.HttpRequest.get_Form() +114 Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.IsSignInResponse(HttpRequest request) +75 Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.CanReadSignInResponse(HttpRequest request, Boolean onPage) +205 Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.CanReadSignInResponse(HttpRequest request) +41 Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs args) +117 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
Escribí una pequeña nota de blog sobre esto aquí: http://erikbra.wordpress.com/2012/04/17/wif-saml-token-post-and-requestvalidationmode2-0/ . No es necesario desactivar la validación de solicitudes o establecerlo en 2.0 para todo el sitio.
En resumen, solo necesita modificar el modo requestValidationMode
al modo 2.0 en la URL específica en la que WIF publica el token SAML. Esto se puede hacer con un elemento (consulte el Elemento de ubicación (Esquema de configuración de ASP.NET) para obtener más detalles) en su web.config, como este:
<location path="WIFHandler">
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
</location>
La ubicación "WIFHandler" no necesita existir en su aplicación, ya que WIF atajará la tubería antes de que ASP.NET intente manejar la solicitud y lo redireccionará a la url de retorno ( ru
en el parámetro wctx
del token POST SAML) en su lugar .
En la sección de configuración de WIF del archivo web.config, asegúrese de hacer coincidir el parámetro "respuesta" con la ubicación donde establece el modo de validación de solicitudes en el modo 2.0:
<microsoft.identityModel>
<service>
<federatedAuthentication>
<wsFederation passiveRedirectEnabled="true"
issuer="https://localhost/STS/"
realm="https://localhost/MyApp/"
reply="https://localhost/MyApp/WIFHandler/" />
(...)
Me encontré con este problema al recorrer el tutorial "Inicio de sesión único de Active Directory a una aplicación de Windows Azure". En mi caso, el problema fue que inadvertidamente coloqué el valor <httpRuntime ... />
en la sección <system.web />
incorrecta en mi archivo web.config (no lo noté originalmente, pero hay un nuevo sección <location>
con una ruta de "FederationMetadata" que también contiene system.web). El valor debe colocarse en la sección de nivel superior <system.web>
.
No he podido encontrar la razón técnica por la que esto no funciona. Sin embargo, desde la perspectiva de los requisitos del negocio, esta es la muestra incorrecta para basar mi solución particular porque solicita autenticación antes de que se pueda acceder a todas las páginas. Sin embargo, el acceso a la página de inicio debe ser anónimo para que se pueda usar el botón "Iniciar sesión".
En cambio, encontré la muestra de inicio de sesión personalizado de MVC3 que cumple con estos requisitos y funciona.
No veo ninguna respuesta aquí mencionar esto. así que aquí va.
Además de "[ValidateInput (false)]", en su aspx, es posible que deba agregar esto a su <% @ Página ...>
<%@ Page ValidateRequest="false">
Esto permitiría deshabilitar la validación de solicitudes por página en lugar de toda la aplicación web.
Primero: estrecho de donde viene esto. Usa el violín para investigar qué campo está causando el problema. Elementos tan simples como: <s provocarán este error cuando se publiquen sin codificarse. También es posible que desee decorar su MODELO con el atributo [AllowHtml] y tratar de no habilitar la codificación 2.0, es un poco peligroso.
Puede intentar decorar la acción del controlador en la que está publicando (y la que arroja esta excepción) con el atributo [ValidateInput(false)]
(dejando <httpRuntime requestValidationMode="2.0"/>
en web.config
).
Yo tuve el mismo problema.
Aquí hay un ejemplo de mi solución:
[ValidateInput(false)]
public ActionResult *YourMethodName*(FormCollection forms)
{
// Encoded String
string EncodedValue = Server.HtmlEncode(forms[*name or index*]);
// Normal String
string value = forms[*name or index*]
//....
}
No necesitas nada en tu webconfig.
Copia SampleRequestValidator desde WIF SDK en el proyecto y configuración en ambos web.configs
Esto debería arreglarlo. ¿Puedes verificar que el código realmente se está ejecutando? Si coloca un punto de interrupción en el validador de solicitud, ¿golpea?
Supongo que pones <httpRuntime...>
en <system.web>
¿verdad?