wywołania jQuery Ajax i Html.Antyforgerytoken()
Zaimplementowałem w swojej aplikacji łagodzenie ataków CSRFzgodnie z informacjami, które przeczytałem na blogu w Internecie. W szczególności te posty były motorem mojej realizacji
- najlepsze praktyki dla ASP.NET MVC z ASP.NET i Web Tools Developer Content Team
- Anatomia ataku fałszywych żądań między stronami z bloga Phila Haacka
- Antyforgerytoken w ASP.NET MVC Framework-Html.Atrybut AntiForgeryToken i Validateantiforgerytoken z bloga Davida Haydena
Zasadniczo te artykuły i zalecenia mówią, że aby zapobiec atakowi CSRF, każdy powinien zaimplementować następujący kod:
1) Dodaj [ValidateAntiForgeryToken]
do każdej akcji, która akceptuje czasownik Http POST
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SomeAction( SomeModel model ) {
}
2) Dodaj helper <%= Html.AntiForgeryToken() %>
wewnątrz formularzy, które przesyłają dane do serwera
<div style="text-align:right; padding: 8px;">
<%= Html.AntiForgeryToken() %>
<input type="submit" id="btnSave" value="Save" />
</div>
W każdym razie w niektórych częściach mojej aplikacji robię posty Ajax z jQuery do serwer bez żadnej formy. Dzieje się tak na przykład wtedy, gdy pozwalam użytkownikowi kliknąć obraz, Aby wykonać określoną akcję.
Załóżmy, że mam tabelę z listą działań. Mam obrazek w kolumnie tabeli z napisem "zaznacz aktywność jako ukończoną" i gdy użytkownik kliknie na tę aktywność, robię Post Ajax jak w poniższej próbce:
$("a.markAsDone").click(function (event) {
event.preventDefault();
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: {},
success: function (response) {
// ....
}
});
});
Jak mogę używać <%= Html.AntiForgeryToken() %>
w takich przypadkach? Czy powinienem włączyć wywołanie helpera wewnątrz parametru data z połączenia Ajax?
Przepraszam za długi post i dziękuję bardzo za pomoc
EDIT :
Zgodnie zjayrdub odpowiedź użyłem w następujący sposób
$("a.markAsDone").click(function (event) {
event.preventDefault();
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: {
AddAntiForgeryToken({}),
id: parseInt($(this).attr("title"))
},
success: function (response) {
// ....
}
});
});
18 answers
Używam prostej funkcji js jak Ta
AddAntiForgeryToken = function(data) {
data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val();
return data;
};
Ponieważ każdy formularz na stronie będzie miał taką samą wartość dla tokena, po prostu umieść coś takiego na swojej najwyższej stronie wzorcowej
<%-- used for ajax in AddAntiForgeryToken() --%>
<form id="__AjaxAntiForgeryForm" action="#" method="post"><%= Html.AntiForgeryToken()%></form>
Następnie w wywołaniu ajax do (edytowane, aby dopasować drugi przykład)
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: AddAntiForgeryToken({ id: parseInt($(this).attr("title")) }),
success: function (response) {
// ....
}
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-02 02:37:55
Podoba mi się rozwiązanie dostarczone przez 360Airwalk, ale może być nieco ulepszone.
Pierwszy problem polega na tym, że jeśli tworzysz {[1] } z pustymi danymi, jQuery nie dodaje nagłówka Content-Type
, a w tym przypadku ASP.NET MVC nie odbiera i nie sprawdza tokena. Więc musisz upewnić się, że nagłówek jest zawsze tam.
Kolejnym usprawnieniem jest obsługa wszystkich czasowników HTTP z treścią : POST, PUT, DELETE itp. Chociaż możesz używać tylko postów w swojej aplikacji, lepiej mieć ogólny Rozwiąż i sprawdź, czy wszystkie dane, które otrzymujesz za pomocą dowolnego czasownika, mają token zapobiegający fałszowaniu.
$(document).ready(function () {
var securityToken = $('[name=__RequestVerificationToken]').val();
$(document).ajaxSend(function (event, request, opt) {
if (opt.hasContent && securityToken) { // handle all verbs with content
var tokenParam = "__RequestVerificationToken=" + encodeURIComponent(securityToken);
opt.data = opt.data ? [opt.data, tokenParam].join("&") : tokenParam;
// ensure Content-Type header is present!
if (opt.contentType !== false || event.contentType) {
request.setRequestHeader( "Content-Type", opt.contentType);
}
}
});
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-20 19:51:02
Nie używaj Html.Antyforgerytoken . Zamiast tego użyj AntiForgery.GetTokens i Antyforgery.Weryfikacja z Web API zgodnie z opisem w zapobieganie atakom Cross-Site Request Forgery (CSRF) .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-06 18:33:14
Wiem, że istnieje wiele innych odpowiedzi, ale ten artykuł jest ładny i zwięzły i zmusza cię do sprawdzenia wszystkich swoich Httposts, a nie tylko niektórych z nich:
Http://richiban.wordpress.com/2013/02/06/validating-net-mvc-4-anti-forgery-tokens-in-ajax-requests/
Używa nagłówków HTTP zamiast próbować modyfikować kolekcję formularzy.
Serwer
//make sure to add this to your global action filters
[AttributeUsage(AttributeTargets.Class)]
public class ValidateAntiForgeryTokenOnAllPosts : AuthorizeAttribute
{
public override void OnAuthorization( AuthorizationContext filterContext )
{
var request = filterContext.HttpContext.Request;
// Only validate POSTs
if (request.HttpMethod == WebRequestMethods.Http.Post)
{
// Ajax POSTs and normal form posts have to be treated differently when it comes
// to validating the AntiForgeryToken
if (request.IsAjaxRequest())
{
var antiForgeryCookie = request.Cookies[AntiForgeryConfig.CookieName];
var cookieValue = antiForgeryCookie != null
? antiForgeryCookie.Value
: null;
AntiForgery.Validate(cookieValue, request.Headers["__RequestVerificationToken"]);
}
else
{
new ValidateAntiForgeryTokenAttribute()
.OnAuthorization(filterContext);
}
}
}
}
Klient
var token = $('[name=__RequestVerificationToken]').val();
var headers = {};
headers["__RequestVerificationToken"] = token;
$.ajax({
type: 'POST',
url: '/Home/Ajax',
cache: false,
headers: headers,
contentType: 'application/json; charset=utf-8',
data: { title: "This is my title", contents: "These are my contents" },
success: function () {
...
},
error: function () {
...
}
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-03 22:28:31
[3]}właśnie wdrażałem ten problem w moim obecnym projekcie. zrobiłem to dla wszystkich postów ajax, które wymagały uwierzytelnionego użytkownika.
Po pierwsze zdecydowałem się podłączyć Moje połączenia jQuery ajax więc nie powtarzać się zbyt często. ten fragment javascript zapewnia, że wszystkie połączenia ajax (post) dodadzą token weryfikacji mojego żądania do żądania. Uwaga: Nazwa _ _ RequestVerificationToken jest używana przez. Net framework, więc mogę korzystać ze standardowych funkcji anty-CSRF, jak pokazano poniżej.
$(document).ready(function () {
var securityToken = $('[name=__RequestVerificationToken]').val();
$('body').bind('ajaxSend', function (elm, xhr, s) {
if (s.type == 'POST' && typeof securityToken != 'undefined') {
if (s.data.length > 0) {
s.data += "&__RequestVerificationToken=" + encodeURIComponent(securityToken);
}
else {
s.data = "__RequestVerificationToken=" + encodeURIComponent(securityToken);
}
}
});
});
W Twoich widokach, gdzie potrzebujesz tokena, aby był dostępny dla powyższego javascript, po prostu użyj wspólnego HTML-Helpera. Możesz zasadniczo dodać ten kod w dowolnym miejscu. Umieściłem go w if (Request.Isauthenticated) twierdzenie:
@Html.AntiForgeryToken() // you can provide a string as salt when needed which needs to match the one on the controller
W kontrolerze wystarczy użyć standardowego ASP.Net mechanizm MVC anty-CSRF. Zrobiłem to tak (choć faktycznie używałem soli).
[HttpPost]
[Authorize]
[ValidateAntiForgeryToken]
public JsonResult SomeMethod(string param)
{
// do something
return Json(true);
}
Za pomocą Firebug lub podobnego narzędzia możesz łatwo zobaczyć, jak twoje żądania POST mają teraz _Dodano parametr _requestverificationtoken.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-07 13:06:27
Czuję się tutaj jak zaawansowany nekromanta, ale to nadal jest problem 4 lata później w MVC5.
Aby poprawnie obsłużyć żądania ajax, token anti-forgery musi zostać przekazany do serwera przy wywołaniach ajax. Integracja go z danymi i modelami postów jest niechlujna i niepotrzebna. Dodanie tokena jako niestandardowego nagłówka jest czyste i wielokrotnego użytku - i można go skonfigurować tak, aby nie musiał pamiętać, aby to robić za każdym razem.
Jest wyjątek - dyskretny ajax nie potrzebuje specjalnych leczenie połączeń ajax. Token jest przekazywany jak zwykle w zwykłym ukrytym polu wprowadzania. Dokładnie tak samo jak zwykły POST.
_Layout.cshtml
In _Layout.cshtml mam ten blok JavaScript. Nie zapisuje tokena do DOM, a raczej używa jQuery do wyodrębnienia go z ukrytego literału wejściowego, który generuje Pomocnik MVC. Magiczny łańcuch, który jest nazwą nagłówka, jest zdefiniowany jako stała w klasie atrybutu.
<script type="text/javascript">
$(document).ready(function () {
var isAbsoluteURI = new RegExp('^(?:[a-z]+:)?//', 'i');
//http://stackoverflow.com/questions/10687099/how-to-test-if-a-url-string-is-absolute-or-relative
$.ajaxSetup({
beforeSend: function (xhr) {
if (!isAbsoluteURI.test(this.url)) {
//only add header to relative URLs
xhr.setRequestHeader(
'@.ValidateAntiForgeryTokenOnAllPosts.HTTP_HEADER_NAME',
$('@Html.AntiForgeryToken()').val()
);
}
}
});
});
</script>
zwróć uwagę na użycie pojedynczych cudzysłowów w funkcja beforeSend - element wejściowy, który jest renderowany, używa podwójnych cudzysłowów, które łamałyby literał JavaScript.
Client JavaScript
Po wykonaniu tej czynności wywoływana jest powyższa funkcja beforeSend i Antyforgerytoken jest automatycznie dodawany do nagłówków żądań.
$.ajax({
type: "POST",
url: "CSRFProtectedMethod",
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function (data) {
//victory
}
});
Biblioteka Serwera
Atrybut niestandardowy jest wymagany do przetworzenia niestandardowego tokena. Opiera się to na rozwiązaniu @viggity, ale poprawnie obsługuje dyskretny ajax. Kod ten można schować w wspólnej bibliotece
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class ValidateAntiForgeryTokenOnAllPosts : AuthorizeAttribute
{
public const string HTTP_HEADER_NAME = "x-RequestVerificationToken";
public override void OnAuthorization(AuthorizationContext filterContext)
{
var request = filterContext.HttpContext.Request;
// Only validate POSTs
if (request.HttpMethod == WebRequestMethods.Http.Post)
{
var headerTokenValue = request.Headers[HTTP_HEADER_NAME];
// Ajax POSTs using jquery have a header set that defines the token.
// However using unobtrusive ajax the token is still submitted normally in the form.
// if the header is present then use it, else fall back to processing the form like normal
if (headerTokenValue != null)
{
var antiForgeryCookie = request.Cookies[AntiForgeryConfig.CookieName];
var cookieValue = antiForgeryCookie != null
? antiForgeryCookie.Value
: null;
AntiForgery.Validate(cookieValue, headerTokenValue);
}
else
{
new ValidateAntiForgeryTokenAttribute()
.OnAuthorization(filterContext);
}
}
}
}
Serwer / Kontroler
Teraz po prostu zastosuj atrybut do swojej akcji. Jeszcze lepiej możesz zastosować atrybut do kontrolera, a wszystkie żądania zostaną zatwierdzone.
[HttpPost]
[ValidateAntiForgeryTokenOnAllPosts]
public virtual ActionResult CSRFProtectedMethod()
{
return Json(true, JsonRequestBehavior.DenyGet);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-16 03:11:36
Myślę, że wszystko, co musisz zrobić, to upewnić się, że wejście "__RequestVerificationToken" jest zawarte w żądaniu POST. Druga połowa informacji (tj. token w pliku cookie użytkownika) jest już wysyłana automatycznie z żądaniem Ajax POST.
Np.,
$("a.markAsDone").click(function (event) {
event.preventDefault();
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: {
"__RequestVerificationToken":
$("input[name=__RequestVerificationToken]").val()
},
success: function (response) {
// ....
}
});
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-02 01:16:36
Możesz to zrobić również:
$("a.markAsDone").click(function (event) {
event.preventDefault();
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: $('<form>@Html.AntiForgeryToken()</form>').serialize(),
success: function (response) {
// ....
}
});
});
Jest to użycie Razor
, ale jeśli używasz składni WebForms
możesz równie dobrze użyć <%= %>
znaczników
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-21 07:08:26
W nawiązaniu do mojego komentarza przeciwko odpowiedzi @JBall, która pomogła mi po drodze, jest to ostateczna odpowiedź, która działa dla mnie. Używam MVC i Razor i wysyłam formularz za pomocą jQuery AJAX, więc mogę zaktualizować częściowy widok z niektórych nowych wyników i nie chciałem zrobić pełny postback (i strona migotanie).
Dodaj @Html.AntiForgeryToken()
do formularza jak zwykle.
Mój kod Ajax submission button (tj. Zdarzenie onclick) to:
//User clicks the SUBMIT button
$("#btnSubmit").click(function (event) {
//prevent this button submitting the form as we will do that via AJAX
event.preventDefault();
//Validate the form first
if (!$('#searchForm').validate().form()) {
alert("Please correct the errors");
return false;
}
//Get the entire form's data - including the antiforgerytoken
var allFormData = $("#searchForm").serialize();
// The actual POST can now take place with a validated form
$.ajax({
type: "POST",
async: false,
url: "/Home/SearchAjax",
data: allFormData,
dataType: "html",
success: function (data) {
$('#gridView').html(data);
$('#TestGrid').jqGrid('setGridParam', { url: '@Url.Action("GetDetails", "Home", Model)', datatype: "json", page: 1 }).trigger('reloadGrid');
}
});
Zostawiłam akcję "sukces" w jak jest aktualizowany widok częściowy, który zawiera MvcJqGrid i jak jest odświeżany(bardzo potężna siatka jqGrid i jest to genialny wrapper MVC do niego).
Moja metoda kontrolera wygląda tak:
//Ajax SUBMIT method
[ValidateAntiForgeryToken]
public ActionResult SearchAjax(EstateOutlet_D model)
{
return View("_Grid", model);
}
Muszę przyznać, że nie jestem fanem zamieszczania danych całego formularza jako modelu, ale jeśli musisz to zrobić, to jest to jeden ze sposobów, który działa. MVC po prostu sprawia, że powiązanie danych jest zbyt łatwe, więc zamiast podstawiać 16 pojedynczych wartości (lub słabo wpisaną FormCollection), to chyba jest OK. Jeśli wiesz lepiej, daj mi znać, ponieważ chcę wyprodukować solidny kod MVC C#.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-08 06:41:19
1.Define Function to get Token from server
@function
{
public string TokenHeaderValue()
{
string cookieToken, formToken;
AntiForgery.GetTokens(null, out cookieToken, out formToken);
return cookieToken + ":" + formToken;
}
}
2.Get token and set header before send to server
var token = '@TokenHeaderValue()';
$http({
method: "POST",
url: './MainBackend/MessageDelete',
data: dataSend,
headers: {
'RequestVerificationToken': token
}
}).success(function (data) {
alert(data)
});
3. Walidacja serwera na httprequestbase na metodzie obsługujesz Post/get
string cookieToken = "";
string formToken = "";
string[] tokens = Request.Headers["RequestVerificationToken"].Split(':');
if (tokens.Length == 2)
{
cookieToken = tokens[0].Trim();
formToken = tokens[1].Trim();
}
AntiForgery.Validate(cookieToken, formToken);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-22 19:17:00
Znalazłem ten bardzo sprytny pomysł z https://gist.github.com/scottrippey/3428114 za każdy $.ajax wywołuje modyfikację żądania i dodaje token.
// Setup CSRF safety for AJAX:
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
if (options.type.toUpperCase() === "POST") {
// We need to add the verificationToken to all POSTs
var token = $("input[name^=__RequestVerificationToken]").first();
if (!token.length) return;
var tokenName = token.attr("name");
// If the data is JSON, then we need to put the token in the QueryString:
if (options.contentType.indexOf('application/json') === 0) {
// Add the token to the URL, because we can't add it to the JSON data:
options.url += ((options.url.indexOf("?") === -1) ? "?" : "&") + token.serialize();
} else if (typeof options.data === 'string' && options.data.indexOf(tokenName) === -1) {
// Append to the data string:
options.data += (options.data ? "&" : "") + token.serialize();
}
}
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-07 22:53:55
Wiem, że minęło trochę czasu od tego pytania został opublikowany, ale znalazłem naprawdę przydatny zasób, który omawia korzystanie z AntiForgeryToken i sprawia, że mniej kłopotliwe w użyciu. Zapewnia również wtyczkę jquery do łatwego włączania tokenu antiforgery w wywołaniach AJAX:
Anty-fałszerstwo przepisy na ASP.NET MVC i AJAX
Nie wkładam zbyt wiele, ale może komuś się to przyda.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-27 15:10:42
/ Align = "left" / To osadza Token anty fałszerstwa w funkcji javascript, więc @ Html.Funkcja AntiForgeryToken() nie musi być już uwzględniana w każdym widoku.
$(document).ready(function () {
var securityToken = $('@Html.AntiForgeryToken()').attr('value');
$('body').bind('ajaxSend', function (elm, xhr, s) {
if (s.type == 'POST' && typeof securityToken != 'undefined') {
if (s.data.length > 0) {
s.data += "&__RequestVerificationToken=" + encodeURIComponent(securityToken);
}
else {
s.data = "__RequestVerificationToken=" + encodeURIComponent(securityToken);
}
}
});
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-03 18:56:20
function DeletePersonel(id) {
var data = new FormData();
data.append("__RequestVerificationToken", "@HtmlHelper.GetAntiForgeryToken()");
$.ajax({
type: 'POST',
url: '/Personel/Delete/' + id,
data: data,
cache: false,
processData: false,
contentType: false,
success: function (result) {
}
});
}
public static class HtmlHelper {
public static string GetAntiForgeryToken() {
System.Text.RegularExpressions.Match value =
System.Text.RegularExpressions.Regex.Match(System.Web.Helpers.AntiForgery.GetHtml().ToString(),
"(?:value=\")(.*)(?:\")");
if (value.Success) {
return value.Groups[1].Value;
}
return "";
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-01 20:40:23
Używam posta ajax do uruchomienia metody delete (zdarza się, że jest z osi czasu visjs, ale to nie jest relelvant). To jest to co ja:
To mój indeks.cshtml@Scripts.Render("~/bundles/schedule")
@Styles.Render("~/bundles/visjs")
@Html.AntiForgeryToken()
<!-- div to attach schedule to -->
<div id='schedule'></div>
<!-- div to attach popups to -->
<div id='dialog-popup'></div>
Dodałem tu tylko @Html.AntiForgeryToken()
aby token pojawił się na stronie
Potem w moim poście ajax użyłem:
$.ajax(
{
type: 'POST',
url: '/ScheduleWorks/Delete/' + item.id,
data: {
'__RequestVerificationToken':
$("input[name='__RequestVerificationToken']").val()
}
}
);
, który dodaje wartość tokena, zeskrobaną ze strony, do pól zamieszczonych
Przed tym próbowałem umieścić wartość w nagłówkach, ale dostałem ten sam błąd
Feel free to post ulepszenia. To z pewnością wydaje się być proste podejście, które mogę zrozumieć
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-26 10:19:09
Najpierw użyj @ Html.Antyforgerytoken () w html
$.ajax({
url: "@Url.Action("SomeMethod", "SomeController")",
type: 'POST',
data: JSON.stringify(jsonObject),
contentType: 'application/json; charset=utf-8',
dataType: 'json',
async: false,
beforeSend: function (request) {
request.setRequestHeader("RequestVerificationToken", $("[name='__RequestVerificationToken']").val());
},
success: function (msg) {
alert(msg);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-30 07:32:13
Oto najprostszy sposób, jaki widziałem. Uwaga: Upewnij się, że masz " @ Html.AntiForgeryToken () " in your View
$("a.markAsDone").click(function (event) {
event.preventDefault();
var sToken = document.getElementsByName("__RequestVerificationToken")[0].value;
$.ajax({
url: $(this).attr("rel"),
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: { '__RequestVerificationToken': sToken, 'id': parseInt($(this).attr("title")) }
})
.done(function (data) {
//Process MVC Data here
})
.fail(function (jqXHR, textStatus, errorThrown) {
//Process Failure here
});
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-03 20:27:22
Antyforgerytoken jest nadal ból, żaden z powyższych przykładów nie pracował słowo w słowo dla mnie. Za dużo na to. Więc połączyłem je wszystkie. Potrzebujesz @ Html.Antyforgerytoken w formie wiszącej wokół iirc
Rozwiązane tak:
function Forgizzle(eggs) {
eggs.__RequestVerificationToken = $($("input[name=__RequestVerificationToken]")[0]).val();
return eggs;
}
$.ajax({
url: url,
type: 'post',
data: Forgizzle({ id: id, sweets: milkway }),
});
W razie wątpliwości dodaj więcej znaków $
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-14 10:10:26