2012-01-27 11 views
10

Estoy construyendo un módulo Orchard CMS que estoy probando en un sitio de Orchard 1.3.10. El módulo muestra una vista de detalles de una de mis entidades y tengo un botón de "favoritos" en el que me gustaría hacer clic y realizar una publicación de AJAX en una acción del controlador para guardar la entidad como favorita en la base de datos.Orchard CMS Ajax Token antifalsificación cuando se conectó

En la vista tengo el siguiente código:

<div style="padding: 10px;"> 
    <span data-id="@Model.Id" id="addFavorite" style="cursor: pointer;"> 
    [Add Favorite] 
    </span> 
</div> 

<script type="text/javascript"> 
    $("#addFavorite").click(function() { 
     alert("here we go..."); 
     $.ajax({ 
      type: "post", 
      dataType: "", 
      url: "/orchardlocal/mymodule/stuff/AddFavorite", 
      data: { id: $(this).data("id") }, 
      success: function (response) { 
       alert("it worked"); 
      } 
     }); 
    }); 
</script> 

Mi acción del controlador es ...

[HttpPost] 
public ActionResult AddFavorite(int id) 
{ 
    return View(); 
} 

Cuando ejecuto el sitio sin tener que entrar en Orchard, este código de mensajes atrás justo multa. Si inicio sesión y hago clic en Agregar favorito, obtengo esta excepción ...

No se proporcionó un token antifalsificación requerido o no era válido.

System.Web.Mvc.HttpAntiForgeryException no fue manejado por el código de usuario Mensaje = No se proporcionó un token antifalsificación requerido o no fue válido. Fuente = System.Web.WebPages ErrorCode = -2147467259 WebEventCode = 0 StackTrace: en System.Web.Helpers.AntiForgeryWorker.Validate (HttpContextBase contexto, sal String) en System.Web.Helpers.AntiForgery.Validate (HttpContextBase HttpContext, sal String) en System.Web.Mvc.ValidateAntiForgeryTokenAttribute.OnAuthorization (AuthorizationContext> filterContext) en Orchard.Mvc.AntiForgery.AntiForgeryAuthorizationFilter.OnAuthorization (AuthorizationContext filterContext) en C: \ code \ OrchardDev2 \ src \ Orchard \ MVC \ AntiForgery \ AntiForgeryAuthorizationFilter.cs: línea 37 en System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters (ControllerContext controllerContext, filtros IList`1, ActionDescriptor a ctionDescriptor) en System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext ControllerContext, Cadena actionName) InnerException:

¿Por qué se trata el mensaje de forma diferente cuando se haya identificado y no?

¿Cómo puedo suministrar un token anti-falsificador para evitar esto?

Gracias, Brian

Respuesta

23

ASP.NET MVC no admite la generación de tokens antifalsificación sin procesar de forma predeterminada. Afortunadamente, Orchard proporciona un método de extensión para eso.

Usted puede cambiar simplemente su llamada ajax como es:

$.ajax({ 
    type: "post", 
    dataType: "", 
    url: "/orchardlocal/mymodule/stuff/AddFavorite", 
    data: { 
     id: $(this).data("id") }, 
     __RequestVerificationToken: '@Html.AntiForgeryTokenValueOrchard()' 
    }, 
    success: function (response) { 
     alert("it worked"); 
    } 
}); 

Esta técnica es útil ya que no es necesario un formulario existente en la página. Aunque esta solución solo es válida si el javascript se procesa desde una vista Razor.

Todavía hay una solución si usted tiene un archivo de secuencia de comandos independiente desde su punto de vista, que es salvar el token anti-falsificación en el interior de una variable javascript declarada desde el punto de vista, a continuación, utilizarlo desde el guión:

@using(Script.Head()) { 
<script type="text/javascript"> 
//<![CDATA[ 
    var antiForgeryToken = '@Html.AntiForgeryTokenValueOrchard()'; 
//]]> 
</script> 
} 

luego, desde el guión:

data: { 
    id: $(this).data("id") }, 
    __RequestVerificationToken: antiForgeryToken 
} 

Si no es así, la solución propuesta por Darin habría que enfoque correcto.

+0

Sebastien, creo que hay un error tipográfico en el sentido de que __RequestVerificationToken debe estar dentro de los datos {}, ¿correcto? Además, cuando agrego el @ Html.AntiForgeryTokenValueOrchard() al javascript, obtengo una línea ondulada en VS diciendo: "La compilación condicional se borró". He leído en otra publicación que dice que este es un error Razor, pero debería hacer esto ... @ (Html.AntiForgeryTokenValueOrchard()). Pero, cuando hago esto, obtengo el error de Javascript "error de sintaxis 4". ¿Qué más podría estar perdiendo aquí? Gracias, Brian –

+0

Completé la respuesta tomando tu comentario en la cuenta –

+0

Sebastien, esto funciona genial. ¡Gracias! –

3

¿Cómo puedo suministrar un token anti-falsificador para evitar esto?

Esto dependerá de dónde se encuentre el campo oculto que contiene el token antifalsificación en la página. Por ejemplo:

$("#addFavorite").click(function() { 
    var token = $(':input[name="__RequestVerificationToken"]').val(); 
    $.ajax({ 
     type: "post", 
     dataType: "", 
     url: "/orchardlocal/mymodule/stuff/AddFavorite", 
     data: { 
      __RequestVerificationToken: token, 
      id: $(this).data("id") 
     }, 
     success: function (response) { 
      alert("it worked"); 
     } 
    }); 
}); 
Cuestiones relacionadas