Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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
C# 如何在ASP.NET核心MVC应用程序Web API控制器中防止CSRF/XSRF_C#_Kendo Grid_Asp.net Core Mvc_Kendo Asp.net Mvc_Kendo Ui Mvc - Fatal编程技术网

C# 如何在ASP.NET核心MVC应用程序Web API控制器中防止CSRF/XSRF

C# 如何在ASP.NET核心MVC应用程序Web API控制器中防止CSRF/XSRF,c#,kendo-grid,asp.net-core-mvc,kendo-asp.net-mvc,kendo-ui-mvc,C#,Kendo Grid,Asp.net Core Mvc,Kendo Asp.net Mvc,Kendo Ui Mvc,向Asp.Net Core MVC应用程序添加防伪功能很容易,方法是将ValidateAntiForgeryToken属性应用于操作,并在表单中使用sp antiforgery=true 如何保护Web API控制器的CRUD操作,该控制器使用带有Authorize属性的个人身份验证和客户端的Kendo MVC网格 只有在客户端上共享cookie时,才会发生CSRF攻击。 我的意思是,客户端可以从多个服务器访问cookie 域(例如,为您创建的每个站点存储cookie的web浏览器) 访问)。但

向Asp.Net Core MVC应用程序添加防伪功能很容易,方法是将ValidateAntiForgeryToken属性应用于操作,并在表单中使用
sp antiforgery=true

如何保护Web API控制器的CRUD操作,该控制器使用带有Authorize属性的个人身份验证和客户端的Kendo MVC网格

只有在客户端上共享cookie时,才会发生CSRF攻击。 我的意思是,客户端可以从多个服务器访问cookie 域(例如,为您创建的每个站点存储cookie的web浏览器) 访问)。但是,web应用程序API客户端通常仅限于联系人 单个域(API的域)。任何跨站点攻击都不能使用 API中的cookies,因为客户端未共享(中的HTTP客户端) 在移动浏览器中,web应用程序与HTTP客户端是分开的- 或者应该是)。因此,您的web应用程序API应该已经 如果API仅适用于您的移动应用程序,则对CSRF安全

这里讨论了在webapi中实现防伪令牌的通用指南

但由于您使用剑道格网,我们必须研究专门针对剑道格网的功能。

1:使用WEBAPI端点:

您可以选择使用数据: 通过读取传输的数据函数以常规方式发送反伪造令牌

transport: {
    read: {
        url: url,
        type: "POST",
        data: {
            __RequestVerificationToken: $("input[name=__RequestVerificationToken]").val()
        }
    }
或使用参数映射:

   @Html.AntiForgeryToken()

 <div id="grid"></div>
<script>
    $(document).ready(function () {
        $("#grid").kendoGrid({
            dataSource: {
                type: "json",
                transport: {
                    read: {
                        url: "/Home/GetProducts",
                        type: "POST"
                    },
                    update: {
                        url: "/Home/UpdateProduct",
                        type: "POST"
                    },
                    parameterMap: function (options, operation) {
                        options.__RequestVerificationToken = $("input[name=__RequestVerificationToken]").val();
                        return options;
                    }
                },
                schema: {
                    model: {
                        id: "ID",
                        fields: {
                            ID: { type: "number", editable: false },
                            Name: { type: "string" }
                        }
                    }
                },
                pageSize: 10
            },
            height: 250,
            filterable: true,
            sortable: true,
            pageable: true,
            editable: "inline",
            columns: ["ID", "Name", {command: "edit"}]
        });
    });
</script>
2:使用基于Ajax的调用

我们将让您使用Datasource中的数据函数向CRUD ops发送防伪令牌

<script type="text/javascript">
    function sendAntiForgery() {
        return { "__RequestVerificationToken": $('input[name=__RequestVerificationToken]').val() }
    }
</script>
您需要在页面上添加此项以生成令牌

@Html.AntiForgeryToken()
然后在剑道网格数据源配置中执行此操作

.DataSource(dataSource => dataSource
                .Ajax()
                .Model(model=>model.Id(m=>m.PersonID))
                    .Read(read => read.Action("GetPersons","Home").Data("sendAntiForgery"))
                    .Update(up => up.Action("UpdatePerson", "Home").Data("sendAntiForgery"))
            )
下面是将令牌发送到CRUD ops的javascript方法

<script type="text/javascript">
    function sendAntiForgery() {
        return { "__RequestVerificationToken": $('input[name=__RequestVerificationToken]').val() }
    }
</script>
有关更多帮助,请查看剑道文档上的这些链接

只有在客户端上共享cookie时,才会发生CSRF攻击。 我的意思是,客户端可以从多个服务器访问cookie 域(例如,为您创建的每个站点存储cookie的web浏览器) 访问)。但是,web应用程序API客户端通常仅限于联系人 单个域(API的域)。任何跨站点攻击都不能使用 API中的cookies,因为客户端未共享(中的HTTP客户端) 在移动浏览器中,web应用程序与HTTP客户端是分开的- 或者应该是)。因此,您的web应用程序API应该已经 如果API仅适用于您的移动应用程序,则对CSRF安全

这里讨论了在webapi中实现防伪令牌的通用指南

但由于您使用剑道格网,我们必须研究专门针对剑道格网的功能。

1:使用WEBAPI端点:

您可以选择使用数据: 通过读取传输的数据函数以常规方式发送反伪造令牌

transport: {
    read: {
        url: url,
        type: "POST",
        data: {
            __RequestVerificationToken: $("input[name=__RequestVerificationToken]").val()
        }
    }
或使用参数映射:

   @Html.AntiForgeryToken()

 <div id="grid"></div>
<script>
    $(document).ready(function () {
        $("#grid").kendoGrid({
            dataSource: {
                type: "json",
                transport: {
                    read: {
                        url: "/Home/GetProducts",
                        type: "POST"
                    },
                    update: {
                        url: "/Home/UpdateProduct",
                        type: "POST"
                    },
                    parameterMap: function (options, operation) {
                        options.__RequestVerificationToken = $("input[name=__RequestVerificationToken]").val();
                        return options;
                    }
                },
                schema: {
                    model: {
                        id: "ID",
                        fields: {
                            ID: { type: "number", editable: false },
                            Name: { type: "string" }
                        }
                    }
                },
                pageSize: 10
            },
            height: 250,
            filterable: true,
            sortable: true,
            pageable: true,
            editable: "inline",
            columns: ["ID", "Name", {command: "edit"}]
        });
    });
</script>
2:使用基于Ajax的调用

我们将让您使用Datasource中的数据函数向CRUD ops发送防伪令牌

<script type="text/javascript">
    function sendAntiForgery() {
        return { "__RequestVerificationToken": $('input[name=__RequestVerificationToken]').val() }
    }
</script>
您需要在页面上添加此项以生成令牌

@Html.AntiForgeryToken()
然后在剑道网格数据源配置中执行此操作

.DataSource(dataSource => dataSource
                .Ajax()
                .Model(model=>model.Id(m=>m.PersonID))
                    .Read(read => read.Action("GetPersons","Home").Data("sendAntiForgery"))
                    .Update(up => up.Action("UpdatePerson", "Home").Data("sendAntiForgery"))
            )
下面是将令牌发送到CRUD ops的javascript方法

<script type="text/javascript">
    function sendAntiForgery() {
        return { "__RequestVerificationToken": $('input[name=__RequestVerificationToken]').val() }
    }
</script>
有关更多帮助,请查看剑道文档上的这些链接


您可以创建一个控制器并注入
IAntiforgery
以获取XsrfToken,然后将其与验证请求一起发送

[Route("api/[controller]")]
public class XsrfTokenController : Controller
{
    private readonly IAntiforgery _antiforgery;

    public XsrfTokenController(IAntiforgery antiforgery)
    {
        _antiforgery = antiforgery;
    }

    [HttpGet]
    public IActionResult Get()
    {
        var tokens = _antiforgery.GetAndStoreTokens(HttpContext);

        return new ObjectResult(new {
            token = tokens.RequestToken,
            tokenName = tokens.HeaderName
        });
    }
}

您可以在

上阅读更多有关它的信息。您可以创建一个控制器并注入
IAntiforgery
以获取XsrfToken,然后将其与验证请求一起发送

[Route("api/[controller]")]
public class XsrfTokenController : Controller
{
    private readonly IAntiforgery _antiforgery;

    public XsrfTokenController(IAntiforgery antiforgery)
    {
        _antiforgery = antiforgery;
    }

    [HttpGet]
    public IActionResult Get()
    {
        var tokens = _antiforgery.GetAndStoreTokens(HttpContext);

        return new ObjectResult(new {
            token = tokens.RequestToken,
            tokenName = tokens.HeaderName
        });
    }
}

您可以在

上阅读更多关于它的信息,Hi Sean谢谢您宝贵的回答。我向上投了一票,并按回答的方式设置。今天,我只找到了2013年的链接,并希望确保它仍然可以与Asp.NETCore和用于jQuery的KendoUI一起使用。再次感谢!随时可以,先生。我已经提到了这个链接以及基于剑道的具体实现Hi Sean感谢你有价值的回答。我向上投了一票,并按回答的方式设置。今天,我只找到了2013年的链接,并希望确保它仍然可以与Asp.NETCore和用于jQuery的KendoUI一起使用。再次感谢!随时可以,先生。我已经给出了该链接以及基于剑道的特定实现的参考。在/api/Read端点上,我得到了一个400(错误请求)的方法。我可以给你发电子邮件吗?我在/api/Read端点上收到一个400(错误请求),方法是1.)。我可以给你发电子邮件吗?我如何将其添加到客户端jQuery网格的剑道UI中?谢谢。@Ahmar:成功登录后如何刷新令牌?如何将其添加到客户端的Kendo UI for jQuery网格中?谢谢。@Ahmar:成功登录后如何刷新令牌?