2012-01-27 12 views
10

Sto costruendo un modulo CMS Orchard che sto testando su un sito Orchard 1.3.10. Il modulo visualizza una vista dettagli per una delle mie entità e ho un pulsante "preferiti" che vorrei fare e fare un post ajax su un'azione del controller per salvare l'entità come preferita nel database.Token anti-contraffazione CMS Ajax di Orchard quando connesso

Ritenendo che ho il seguente codice:

<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> 

La mia azione di controllo è ...

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

Quando eseguo il sito senza essere collegati in frutteto, questo codice i messaggi di nuovo solo bene. Se accedo e clic su Aggiungi preferito, ottengo questa eccezione ...

Un token anti-contraffazione richiesto non è stato fornito o non era valido.

System.Web.Mvc.HttpAntiForgeryException non gestito dal codice utente Messaggio = Un token anti-contraffazione richiesto non è stato fornito o non era valido. Source = System.Web.WebPages ErrorCode = -2147467259 WebEventCode = 0 StackTrace: a System.Web.Helpers.AntiForgeryWorker.Validate (HttpContextBase contesto, sale String) a System.Web.Helpers.AntiForgery.Validate (HttpContextBase HttpContext, sale String) a System.Web.Mvc.ValidateAntiForgeryTokenAttribute.OnAuthorization (AuthorizationContext> filterContext) a Orchard.Mvc.AntiForgery.AntiForgeryAuthorizationFilter.OnAuthorization (AuthorizationContext filterContext) in C: \ Codice \ OrchardDev2 \ src \ Orchard \ Mvc \ AntiForgery \ AntiForgeryAuthorizationFilter.cs: riga 37 su System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters (ControllerContext controllerContext, IList`1 filtri, ActionDescriptor a ctionDescriptor) a System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext, String ActionName) InnerException:

Perché si tratti del post in modo diverso quando connesso e non?

Come posso fornire un token anti-forger per evitare questo?

Grazie, Brian

risposta

23

ASP.NET MVC non supporta la generazione di token anti-contraffazione non elaborati per impostazione predefinita. Fortunatamente Orchard fornisce un metodo di estensione per questo.

si può semplicemente cambiare la vostra chiamata AJAX come è:

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

Questa tecnica è utile in quanto non è necessario un modulo esistente sulla tua pagina. Anche se questa soluzione è valida solo se il javascript è reso da una vista Razor.

c'è ancora una soluzione se si dispone di un file script separato dalla vista, che è quello di salvare il token anti-contraffazione all'interno di una variabile JavaScript dichiarata dal punto di vista, quindi utilizzarlo dallo script:

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

poi dallo script:

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

in caso contrario, la soluzione proposta da Darin sarebbe egli approccio corretto.

+0

Sebastien, penso che ci sia un errore di battitura in quanto il __RequestVerificationToken dovrebbe essere all'interno dei dati {}, corretto? Inoltre, quando aggiungo @ Html.AntiForgeryTokenValueOrchard() a javascript, sto ottenendo una linea ondulata in VS che dice: "La compilazione condizionale è disattivata". Ho letto su un altro post che afferma che questo è un bug Razor ma dovrei farlo ... @ (Html.AntiForgeryTokenValueOrchard()). Ma quando faccio questo mi viene visualizzato l'errore javascript "sintassi errore 4". Cos'altro potrei mancare qui? Grazie, Brian –

+0

Ho completato la risposta tenendo conto del tuo commento –

+0

Sebastien, questo funziona benissimo. Grazie! –

3

Come posso fornire un token anti-falsario per evitare questo?

Dipende da dove si trova il campo nascosto contenente il token anti-contraffazione nella pagina. Ad esempio:

$("#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"); 
     } 
    }); 
}); 
Problemi correlati