Estoy haciendo solicitudes AJAX basadas en JSON y, con los controladores MVC, le he agradecido a Phil Haack por su Preventing CSRF with AJAX y, a Johan Driessen Updated Anti-XSRF for MVC 4 RC. Pero, al hacer la transición de los controladores centrados en la API a la API web, estoy abordando problemas donde la funcionalidad entre los dos enfoques es marcadamente diferente y no puedo hacer la transición del código CSRF.Problemas al implementar el atributo ValidatingAntiForgeryToken para la API web con MVC 4 RC
ScottS levantó un similar question recientemente que fue answered por Darin Dimitrov. La solución de Darin implica la implementación de un filtro de autorización que llama a AntiForgery.Validate. Desafortunadamente, este código no funciona para mí (ver el párrafo siguiente) y, honestamente, es demasiado avanzado para mí.
Según tengo entendido, la solución de Phil supera el problema con MVC AntiForgery al hacer peticiones JSON en la ausencia de un elemento de formulario; el elemento de forma es asumido/esperado por el método AntiForgery.Validate. I creo que esta puede ser la razón por la que estoy teniendo problemas con la solución de Darin también. Recibo una HttpAntiForgeryException "El campo de formulario antifalsificación requerido '__RequestVerificationToken' no está presente". Estoy seguro de que el token se está enviando por correo (aunque en el encabezado según la solución de Phil Haack). He aquí una instantánea de la llamada de cliente:
$token = $('input[name=""__RequestVerificationToken""]').val();
$.ajax({
url:/api/states",
type: "POST",
dataType: "json",
contentType: "application/json: charset=utf-8",
headers: { __RequestVerificationToken: $token }
}).done(function (json) {
...
});
Probé un corte por maceración junto solución de Johan con Darin y fue capaz de hacer las cosas de trabajo, pero estoy presentando HttpContext.Current, sin saber si esto es apropiado/seguro y por qué no puede usar el proporcionado HttpActionContext.
Aquí es mi poco elegante mash-up .. el cambio es las 2 líneas en el bloque try:
public Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
{
try
{
var cookie = HttpContext.Current.Request.Cookies[AntiForgeryConfig.CookieName];
AntiForgery.Validate(cookie != null ? cookie.Value : null, HttpContext.Current.Request.Headers["__RequestVerificationToken"]);
}
catch
{
actionContext.Response = new HttpResponseMessage
{
StatusCode = HttpStatusCode.Forbidden,
RequestMessage = actionContext.ControllerContext.Request
};
return FromResult(actionContext.Response);
}
return continuation();
}
Mis preguntas son:
- Estoy en lo correcto al pensar que la solución de Darin asume la existencia de un elemento de forma?
- ¿Cuál es una manera elegante de mash-up de filtro Web API de Darin con MVC 4 código RC de Johan?
¡Gracias de antemano!
¿cuál es el resultado de? –