2011-03-26 14 views
8

En mi sitio MVC3 evité establecer requestValidationMode = "2.0" con el nuevo atributo ValidateInput, pero ahora estoy intentando cambiar a WIF para la autenticación, y cuando el STS redirige De regreso a mi sitio, obtengo la excepción porque WSFederationAuthenticationModule.IsSignInResponse llama al Request.Form en lugar de Request.Unvalidated().Form ... ¿hay alguna manera de solucionar esto sin ir a requestValidationMode = "2.0" (que realmente no quiero hacer).Request.Form potencialmente peligroso en WSFederationAuthenticationModule.IsSignInResponse

Aquí está el seguimiento de la pila, para que pueda ver lo que quiero decir. El método de mi Controlador nunca se llama realmente.

[HttpRequestValidationException (0x80004005): A potentially dangerous Request.Form value was detected from the client (wresult="<trust:RequestSecuri...").] 
    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) +21 
    Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.CanReadSignInResponse(HttpRequest request, Boolean onPage) +121 
    Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs args) +78 
    System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75 

Respuesta

12

La forma correcta de hacer frente a esto es agregar específica validador a HttpRuntime, que sabe cómo detectar tokens de seguridad válidos.

vistazo a cualquiera de los ejemplos aquí: http://claimsid.codeplex.com/releases/view/62929

He aquí un extracto de uno de ellos (muestra # 5 t ser específica que es también una aplicación MVC):

namespace FShipping 
{ 
    using System; 
    using System.Web; 
    using System.Web.Util; 
    using Microsoft.IdentityModel.Protocols.WSFederation; 

    public class WsFederationRequestValidator : RequestValidator 
    { 
     protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex) 
     { 
      validationFailureIndex = 0; 
      if (requestValidationSource == RequestValidationSource.Form && 
       collectionKey.Equals(WSFederationConstants.Parameters.Result, StringComparison.Ordinal)) 
      { 
       if (WSFederationMessage.CreateFromFormPost(context.Request) as SignInResponseMessage != null) 
       { 
        return true; 
       } 
      } 

      return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex); 
     } 
    } 
} 

Aquí está el config:

<system.web> 
... 
    <httpRuntime requestValidationType="FShipping.WsFederationRequestValidator" /> 
</system.web> 
+1

@Euginio: gracias por eso, esa información aparentemente se agregó en el [2 de agosto de 2010 publicación del libro "Guía de identidad de reclamaciones"] (http://claimsid.codeplex.com/releases/view/50000). ¿Será esto en documentos oficiales pronto? [MSDN] (http://www.google.com/search?q=%2BWIF+%2BRequestValidator+site%3Amsdn.microsoft.com+site-site%3Asocial.msdn.microsoft.com) y [TechNet] (http: // www.google.com/search?q=%2BWIF+%2BRequestValidator+site%3Atechnet.microsoft.com+site-site%3Asocial.technet.microsoft.com) no mencionar esto en absoluto. Una actualización de la página Problemas conocidos de WIF parece estar en orden, como mínimo. –

+0

Parece una solución más limpia que la que se me ocurrió, que consistía en establecer la validación en 2.0 y utilizar un código similar para ese fragmento en Global.asax.cs Application_BeginRequest para llamar a Request.ValidateInput() en todos los casos excepto en el inicio de sesión de inicio de sesión . – Jaykul

+0

Y funciona ;-) – Jaykul

2

Creo que también se observó este mismo error en algún momento, pero si mal no recuerdo que fue en algún código andamios experimental o de prueba, por lo que no tienen un requisito de seguridad estricta allí.

La información oficial que pude encontrar es que se trata de un problema conocido en WIF: consulte la sección "ASP.NET detecta tokens de federación pasiva como posible ataque de seguridad" al comienzo de the WIF Known Issues page. Dicen que hay que configurar validateRequest="false" en web.config, o la directiva equivalente ASP.NET Page para hacer esto a nivel de página.

Para que intente configurar esto solo en una directiva Page en la 'página de inicio' de su aplicación, no estoy seguro, pero podría funcionar.

Nota que no hablan de requestValidationMode="2.0" en el WIF página de problemas conocidos, pero a juzgar por this TechNet wiki page esta configuración adicional es necesaria para ASP.NET 4.

+0

Hey, gracias por el enlace a los problemas conocidos - se ve como WIF de no adaptado a la MVC3 y no tienen acceso a Validation.Unvalidated http://msdn.microsoft.com/en- us/library /system.web.helpers.validation.unvalidated%28v=vs.99%29.aspx (marcaré esto como la respuesta si nadie realmente puede darme una vuelta, pero me pone muy triste). – Jaykul

Cuestiones relacionadas