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

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) {
            // ....
        }
    });
});
Author: Community, 2010-11-02

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) {
        // ....
    }
});
 229
Author: JeremyWeir,
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);
            }
        }
    });
});
 26
Author: Bronx,
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) .

 18
Author: Edward Brey,
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 () {
        ...
    }
});
 16
Author: viggity,
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.

 15
Author: 360Airwalk,
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);
}
 14
Author: Will D,
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) {
            // ....
        }
    });
});
 11
Author: jball,
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

 5
Author: Leonardo Garcia Crespo,
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#.

 4
Author: Ralph Bacon,
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);
 3
Author: Tonman Neverwalk alone,
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();
        }
    }
});
 3
Author: masterlopau,
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.

 1
Author: slawek,
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);
            }
        }
    });
});
 0
Author: Barry MSIH,
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 "";
    }
}
 0
Author: ismail eski,
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ć

 0
Author: Nick.McDermaid,
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);
        }
 0
Author: Amir Reza,
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
        });
    });
 0
Author: Dominic Sputo,
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 $

 -2
Author: Hazza,
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