我有一个AngularJS单页应用程序(SPA),它由ASP.NET MVC应用程序托管。
后端是ASP.NET Web .
我想通过在ASP.NET MVC部件中生成一个AntiForgeryToken来保护它免受ASP.NET 攻击,然后将它传递给AngularJS,然后让Web 验证从后续E 116AngularJSE 217调用接收的AntiForgeryToken。
“跨站点请求伪造(CSRF)是一种攻击,它迫使最终用户在当前通过身份验证的web应用程序上执行不必要的操作。CSRF攻击专门针对状态变化的请求,而不是窃取数据,因为攻击者无法看到对伪造请求的响应。借助一些社交工程的帮助(例如通过电子邮件或聊天发送链接),攻击者可能会欺骗web应用程序的用户执行攻击者选择的操作。如果受害者是正常用户,成功的CSRF攻击会迫使用户执行状态更改请求,如转移资金、更改电子邮件地址等。如果受害者是一个管理帐户,CSRF可能会危及整个web应用程序。“。
发布于 2017-10-13 16:01:56
添加到ASP.NET MVC视图中
<Form ng-submit="SubmitForm(FormDataObject)">
@Html.AntiForgeryToken()
.....
...
.
</Form>然后在AngularJs控制器
angular.module('myApp', []).controller('myController', function ($scope, $http, $httpParamSerializerJQLike) {
$scope.antiForgeryToken = angular.element('input[name="__RequestVerificationToken"]').attr('value');
$scope.SubmitForm = function (formData) {
var dataRequest = {
__RequestVerificationToken: $scope.antiForgeryToken,
formData: angular.toJson(formData)
};
$http.post("/url/...", $httpParamSerializerJQLike(dataRequest), { headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' } }).then(function (response) {
$scope.result = JSON.parse(response.data);
});
}
});为什么$httpParamSerializerJQLike(dataRequest)?因为如果没有这些,AngularJs将数据序列化为:
{__RequestVerificationToken: blablabla, formData: blablabla}而Asp.NET MVC控制器抛出所需的防伪表单字段“__RequestVerificationToken”不存在错误。
但是,如果您使用$httpParamSerializerJQLike(dataRequest),将请求数据序列化为:
__RequestVerificationToken: blablabla
formData: blablabla而Asp.NET MVC控制器可以在没有任何错误的情况下识别令牌。
https://stackoverflow.com/questions/32460196
复制相似问题