Câu trả lời:
Bạn có [ValidateAntiForgeryToken]
thuộc tính trước hành động của bạn. Bạn cũng nên thêm @Html.AntiForgeryToken()
vào mẫu của bạn.
Html.AntiForgeryToken();
không hoạt động !! Biến thành @Html.AntiForgeryToken()
công việc
Trong trường hợp của tôi, tôi đã có cái này trong web.config:
<httpCookies requireSSL="true" />
Nhưng dự án của tôi đã được thiết lập để không sử dụng SSL. Nhận xét dòng đó hoặc thiết lập dự án để luôn sử dụng SSL đã giải quyết nó.
IIS
có ràng buộc này ( https » EmptyHostName » IP » 443
) nhưng không có ràng buộc cho ( https » www.mysite.com » IP » 443
). Vì vậy, tôi đã thêm một ràng buộc mới với tên máy chủ không trống cho tên miềnhttps
đó bằng với tên miền và Nó đã giải quyết vấn đề. Tôi đã viết lại cài đặt IIS
để buộc http 2 https
quá.
Như thế này:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
...
Code Block
...
}
@using(Html.BeginForm())
{
@Html.AntiForgeryToken()
<input name="..." type="text" />
// rest
}
Ngoài ra, hãy đảm bảo tránh không sử dụng [ValidateAntiForgeryToken] trong [HttpGet].
[HttpGet]
public ActionResult MethodName()
{
..
}
Bạn sẽ nhận được lỗi ngay cả khi Cookies không được bật.
Một điều khác có thể gây ra điều này (chỉ cần chạy vào đây) là như sau: nếu bạn vì một lý do nào đó vô hiệu hóa tất cả các trường đầu vào trong biểu mẫu của bạn. nó sẽ vô hiệu hóa trường nhập liệu ẩn chứa mã thông báo xác minh của bạn. khi biểu mẫu sẽ được đăng lại, giá trị mã thông báo sẽ bị thiếu và sẽ phát sinh lỗi mà nó bị thiếu. vì vậy, những gì bạn cần làm là kích hoạt lại trường nhập giữ mã thông báo xác minh và tất cả sẽ ổn.
Một khả năng khác cho những người trong chúng tôi tải lên các tệp như một phần của yêu cầu. Nếu độ dài nội dung vượt quá <httpRuntime maxRequestLength="size in kilo bytes" />
và bạn đang sử dụng mã thông báo xác minh yêu cầu, trình duyệt sẽ hiển thị 'The required anti-forgery form field "__RequestVerificationToken" is not present'
thông báo thay vì thông báo vượt quá độ dài yêu cầu.
Đặt maxRequestLpm thành một giá trị đủ lớn để phục vụ cho yêu cầu khắc phục vấn đề ngay lập tức - mặc dù tôi sẽ thừa nhận đó không phải là giải pháp phù hợp (chúng tôi muốn người dùng biết vấn đề thực sự về kích thước tệp chứ không phải do thiếu mã xác minh yêu cầu).
Đảm bảo trong bộ điều khiển của bạn rằng bạn có thuộc tính http như:
[HttpPost]
cũng thêm thuộc tính trong bộ điều khiển:
[ValidateAntiForgeryToken]
Trong mẫu của bạn trên quan điểm của bạn, bạn phải viết:
@Html.AntiForgeryToken();
Tôi đã có Html.AntiForgeryToken (); không có dấu @ trong khi nó ở trong một khối mã, nó không có lỗi trong Dao cạo nhưng đã xảy ra khi chạy. Hãy chắc chắn rằng bạn nhìn vào dấu @ của @ Html.Ant .. nếu nó bị thiếu hay không
Trong trường hợp của tôi, tôi đã có javascript này trên mẫu gửi:
$('form').submit(function () {
$('input').prop('disabled', true);
});
Điều này đã xóa RequestVerifyingToken ẩn khỏi biểu mẫu đang được gửi. Tôi đã thay đổi thành:
$('form').submit(function () {
$('input[type=submit]').prop('disabled', true);
$('input[type=text]').prop('readonly', true);
$('input[type=password]').prop('readonly', true);
});
... Và nó hoạt động tốt.
readonly
và loại trừ các điều khiển ẩn. Có vẻ để làm việc độc đáo.
Trong trường hợp của tôi, tên miền không chính xác trong web.config cho cookie là lý do:
<httpCookies domain=".wrong.domain.com" />
Trong trường hợp của tôi đó là do thêm requireSSL=true
để httpcookies
trong webconfig khiến trạm làm việc AntiForgeryToken. Thí dụ:
<system.web>
<httpCookies httpOnlyCookies="true" requireSSL="true"/>
</system.web>
Để làm cho cả hai requireSSL=true
và @Html.AntiForgeryToken()
công việc tôi đã thêm dòng này vào Application_BeginRequest
trongGlobal.asax
protected void Application_BeginRequest(object sender, EventArgs e)
{
AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
}
Đã xảy ra lỗi này trong Chrome khi đăng nhập mặc định cho ASP.NET bằng Tài khoản người dùng cá nhân
.cshtml:
@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>Use a local account to log in.</h4>
Điều khiển:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
Giải quyết bằng cách xóa dữ liệu trang web cho trang web:
Trong giải pháp EPiServer của tôi trên một số bộ điều khiển, có một thuộc tính ContentOutputCache trên hành động Index đã chấp nhận HttpGet. Mỗi chế độ xem cho các hành động đó chứa một biểu mẫu được đăng lên một hành động HttpPost cho cùng một bộ điều khiển hoặc tới một hành động khác. Ngay sau khi tôi loại bỏ thuộc tính đó khỏi tất cả các vấn đề hành động Index đó đã biến mất.
Bởi vì điều này xuất hiện với tìm kiếm đầu tiên này:
Tôi chỉ gặp vấn đề này trong Internet Explorer và không thể hiểu vấn đề là gì. Tóm lại, nó không lưu phần cookie của Mã thông báo vì tên miền (phụ) của chúng tôi có dấu gạch dưới trong đó. Đã hoạt động trong Chrome nhưng IE / Edge không thích nó.
Tất cả các câu trả lời khác ở đây cũng hợp lệ, nhưng nếu không có câu trả lời nào trong số đó giải quyết vấn đề thì cũng đáng để kiểm tra xem các tiêu đề thực tế đang được chuyển đến máy chủ.
Ví dụ: trong môi trường cân bằng tải phía sau nginx, cấu hình mặc định là loại bỏ tiêu đề __RequestVerifyingToken trước khi chuyển yêu cầu đến máy chủ, xem: proxy ngược nginx đơn giản dường như loại bỏ một số tiêu đề
Đôi khi bạn đang viết một phương thức hành động biểu mẫu với một danh sách kết quả. Trong trường hợp này, bạn không thể làm việc với một phương thức hành động. Vì vậy, bạn phải có hai phương thức hành động có cùng tên. Một với [HttpGet]
và một với [HttpPost]
thuộc tính.
Trong [HttpPost]
phương thức hành động của bạn , đặt [ValidateAntiForgeryToken]
thuộc tính và cũng đặt @Html.AntiForgeryToken()
ở dạng html của bạn.
Trong trường hợp của tôi, tôi đã gặp phải lỗi này khi tạo một bài đăng AJAX, hóa ra là giá trị __RequestVerifyingToken không được truyền qua trong cuộc gọi. Tôi đã phải tự tìm giá trị của trường này và đặt nó làm thuộc tính trên đối tượng dữ liệu được gửi đến điểm cuối.
I E
data.__RequestVerificationToken = $('input[name="__RequestVerificationToken"]').val();
HTML
<form id="myForm">
@Html.AntiForgeryToken()
<!-- other input fields -->
<input type="submit" class="submitButton" value="Submit" />
</form>
Javascript
$(document).on('click', '#myForm .submitButton', function () {
var myData = { ... };
myData.__RequestVerificationToken = $('#myForm input[name="__RequestVerificationToken"]').val();
$.ajax({
type: 'POST',
url: myUrl,
data: myData,
contentType: 'application/x-www-form-urlencoded; charset=utf-8',
dataType: 'json',
success: function (response) {
alert('Form submitted');
},
error: function (e) {
console.error('Error submitting form', e);
alert('Error submitting form');
},
});
return false; //prevent form reload
});
Bộ điều khiển
[HttpPost]
[Route("myUrl")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> MyUrlAsync(MyDto dto)
{
...
}
public class MyDto { public bool Whatever { get; set; } }
Tôi muốn chia sẻ của tôi, tôi đã theo dõi hướng dẫn chống giả mạo này
bằng cách sử dụng asp.net mvc 4 với angularjs, nhưng nó ném một ngoại lệ mỗi khi tôi yêu cầu sử dụng $ http.post và tôi đã tìm ra giải pháp chỉ là thêm
'X- Được yêu cầu-Với ':' XMLHttpRequest ' cho các tiêu đề của $ http.post, vì có vẻ như (filterContext.HttpContext.Request.IsAjaxRequest())
không nhận ra đó là ajax và đây là mã ví dụ của tôi.
App.js
var headers = {
'X-Requested-With': 'XMLHttpRequest',
'RequestVerificationToken': $scope.token,
'Content-Type': 'application/json; charset=utf-8;'
};
$http({
method: 'POST',
url: baseURL + 'Save/User',
data: JSON.stringify($scope.formData),
headers: headers
}).then(function (values) {
alert(values.data);
}).catch(function (err) {
console.log(err.data);
});
SaveControll
[HttpPost]
[MyValidateAntiForgeryToken]
public ActionResult User(UserModel usermodel)
{
....