Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不带表单的ASP.NET Core Antiforgery令牌_Javascript_Jquery_Asp.net_Asp.net Core - Fatal编程技术网

Javascript 不带表单的ASP.NET Core Antiforgery令牌

Javascript 不带表单的ASP.NET Core Antiforgery令牌,javascript,jquery,asp.net,asp.net-core,Javascript,Jquery,Asp.net,Asp.net Core,有没有可能有不带表单的防伪代币?我有一个ajax post呼叫,我想打这个电话,需要一个反伪造令牌。然而,我看到的大多数例子都是索取表格。这就是我到目前为止所做的: <script> $(document).ready(function () { var SessionId = document.getElementById("Id").value; var form_data = { "SessionId": Sess

有没有可能有不带表单的防伪代币?我有一个ajax post呼叫,我想打这个电话,需要一个反伪造令牌。然而,我看到的大多数例子都是索取表格。这就是我到目前为止所做的:

<script>
    $(document).ready(function () {
        var SessionId = document.getElementById("Id").value;
        var form_data = {
            "SessionId": SessionId
        };
        $.ajax({
            url: "@Url.Action("GetHistory", @ViewContext.RouteData.Values["controller"].ToString())",
            method: "POST",
            data: JSON.stringify(form_data),
            contentType: "application/json",
            success: function (result) {
                console.log(result);
                var output = JSON.parse(result);
                for (var i = 0; i < output.length; i++) {
                    var p = document.createElement("span");
                    var q = document.createElement("li");
                    if (output[i].Mine == true) {
                        p.setAttribute("class", "Sender Me");
                        q.setAttribute("class", "Message");
                    } else {
                        p.setAttribute("class", "Sender");
                        q.setAttribute("class", "Message");
                    }
                    p.textContent = output[i].Name + " - " + moment(output[i].CreatedOn).format("DD-MM-YYYY HH:mm:ss");
                    q.textContent = output[i].Message;
                    document.getElementById("MessageList").appendChild(p);
                    document.getElementById("MessageList").appendChild(q);
                }

            },
            error: function (error) {
                console.log(error);
            }
        });

        $('#MessageList').stop().animate({
            scrollTop: $('#MessageList')[0].scrollHeight
        }, 2000);
        return false;
    });
</script>

$(文档).ready(函数(){
var SessionId=document.getElementById(“Id”).value;
变量形式_数据={
“SessionId”:SessionId
};
$.ajax({
url:“@url.Action(“GetHistory”、@ViewContext.RoutedData.Values[“controller”].ToString())”,
方法:“张贴”,
数据:JSON.stringify(form_data),
contentType:“应用程序/json”,
成功:功能(结果){
控制台日志(结果);
var output=JSON.parse(结果);
对于(变量i=0;i

这只是从一个文本框和一个未附加到表单的按钮获取输入。

AntiforgeryToken用于防止跨站点请求伪造。所以你真的应该使用它。在jQuery中获取一个表单的最简单方法是在页面上呈现一个虚拟的隐藏表单。然后,您可以使用javaScript从虚拟表单复制令牌,并将其包含在ajax帖子中。

您需要手动添加它。试试这个:

var-token=$(“[name=”\uuuu-RequestVerificationToken']”).val()

然后将其与您的数据一起发布:

数据:{
__RequestVerificationToken:令牌,
stringify(表单_数据)
}

编辑:

正如@AndresAbel所提到的,您可以从表单中复制令牌并在ajax post中发送:

@using(Html.BeginForm(null,null,FormMethod.Post,new{id=“\uuu-AjaxAntiForgeryForm”}))
{
@Html.AntiForgeryToken()
}

然后在脚本中:

var-token=$('input[name=“\uuuu-RequestVerificationToken”],$('uuuuu-AjaxAntiForgeryForm')).val()

然后用ajax发送:

数据:{
__RequestVerificationToken:令牌,
stringify(表单_数据)
}


不要忘记在控制器中为您的方法添加注释。

Ajax请求可以将请求头中的防伪令牌发送到服务器。请参阅中的解决方案


当然,您需要为您的操作使用正确的模型绑定和
[ValidateAntiForgeryToken]
属性。

这将如何实现?在呈现表单时生成防伪令牌。因此,如果我在没有表单的情况下进行ajax调用,我的POST调用是否安全?我的POST调用可能不安全!但是您可以使用ajax和antiforgery令牌提交表单。你有没有使用过这里详细介绍的方法?嗨!你的方法几乎适合我。我犯了一个错误。来自数据:{}节的意外标记。有什么不对劲吗?
<script type="text/javascript">
    function gettoken() {
        var token = '@Html.AntiForgeryToken()';
        token = $(token).val();
        return token;
        }   
</script>
<script>
$(document).ready(function () {
    var SessionId = document.getElementById("Id").value;
    var form_data = {
        "SessionId": SessionId
    };

    var headers = {};
    headers['XSRF-TOKEN'] = gettoken();//header name could be changed
    $.ajax({
        url: "/Home/testPost",
        method: "POST",
        data: JSON.stringify(form_data),          
        headers:headers,
        contentType: "application/json",


        success: function (result) {
            console.log(result);
            //...
        },
        error: function (error) {
            console.log(error);
        }
    });
   //...

});
public void ConfigureServices(IServiceCollection services)
{
  services.AddMvc();
  services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");
}