C# 如何在ASP.NET核心MVC应用程序Web API控制器中防止CSRF/XSRF
向Asp.Net Core MVC应用程序添加防伪功能很容易,方法是将ValidateAntiForgeryToken属性应用于操作,并在表单中使用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浏览器) 访问)。但
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:成功登录后如何刷新令牌?