Trường biểu mẫu chống giả mạo bắt buộc Bắt đầu __RequestVerifyingToken trực tiếp không có Lỗi trong đăng ký người dùng


141

Tôi đang sử Membership.createdụng chức năng người dùng, sau đó xảy ra lỗi sau đây,

Trường biểu mẫu chống giả mạo bắt buộc "__RequestVerifyingToken" không có mặt

Làm thế nào tôi có thể sửa lỗi này?

Câu trả lời:


218

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.


11
Tôi có một trang web có cùng một vấn đề nhưng toàn bộ điều này là chính xác. có lỗi gì
Tiến hành kiểm tra

@ConductedClever Bạn nên kiểm tra cẩn thận tất cả mọi thứ (trường, cookies) với cáy và / hoặc con đom đóm (bất kỳ công cụ trình duyệt dev), xem bài viết này: asp.net/web-api/overview/security/...
webdeveloper

@ConductedCách tôi cũng vậy. Đó là công việc nhưng hiếm khi gặp lỗi này và tôi không biết TẠI SAO?
QMaster

Tôi có mọi thứ đều ổn, trong các thử nghiệm của tôi, nó hoạt động, trên máy của khách hàng, nó hoạt động cho đến gần đây, nhưng bây giờ nó đã báo lỗi này. Tôi không biết tại sao. Có ai có ý tưởng khác ngoài những ý tưởng được liệt kê ở đây xin vui lòng?
Andrei Dobrin

1
Html.AntiForgeryToken();không hoạt động !! Biến thành @Html.AntiForgeryToken()công việc
FindOutIslamNow

78

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ó.


3
Trong trường hợp của tôi, web.config có yêu cầuSSL nhưng có các ràng buộc IIS cho cả cổng 80 và 443, vì vậy người dùng nhập https đang có hành vi đúng và người dùng nhập http đã gặp lỗi này, đưa vào quy tắc viết lại để buộc tất cả phải https: / / {HTTP_HOST} / {R: 1} đã sửa nó
user1069816

Cảm ơn bạn Trong trường hợp của tôi IIScó 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 httpsquá.
RAM

61

Như thế này:

Bộ điều khiển

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
     ...
     Code Block
     ...
}

Chế độ xem:

@using(Html.BeginForm())
{
     @Html.AntiForgeryToken()
     <input name="..." type="text" />
     // rest
}

Thử chỉ sử dụng trong HTML
Subrata Sarkar

41

Ngoài ra, hãy đảm bảo tránh không sử dụng [ValidateAntiForgeryToken] trong [HttpGet].

  [HttpGet]
  public ActionResult MethodName()
  {
  ..
  }

1
Câu trả lời này bổ sung cho những người khác và giải quyết vấn đề của tôi! Cảm ơn
Lucas

1
Câu trả lời này giả định rằng bạn không lưu bất kỳ dữ liệu đã gửi nào (mà bạn không nên sử dụng trên HTTPGet). Nếu là bạn, thì bạn vẫn cần bảo vệ XSRF mà [ValidateAntiForgeryToken] cung cấp.
thelem

9

Bạn sẽ nhận được lỗi ngay cả khi Cookies không được bật.


2
Đánh tốt Tôi đã sử dụng Internet Explorer. Sử dụng trình duyệt Chrome đã giải quyết vấn đề cho tôi
FindOutIslamNow

Điều này cũng giải quyết vấn đề của tôi. bật cookie trong google chrome. Cảm ơn
Phương pháp khoa học

7

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.


6

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" /> 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).


5

Đả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


5

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.


Làm thế nào bạn nhận thấy rằng phím chống bị ảnh hưởng khi bạn tắt đầu vào?
Cer

1
@Cer - nếu bạn hỏi làm thế nào tôi nhận thấy, tôi đã kiểm tra yêu cầu với fiddler và chọn rằng khóa không được gửi. Tôi đọc rằng Html gửi sẽ không bao gồm các điều khiển bị vô hiệu hóa. Vì vậy, tôi đã thay đổi nó readonlyvà loại trừ các điều khiển ẩn. Có vẻ để làm việc độc đáo.
Sean

3

Nếu bất cứ ai gặp lỗi vì lý do tương tự tại sao tôi gặp phải, đây là giải pháp của tôi:

nếu bạn có Html.AntiForgeryToken();

thay đổi nó thành @Html.AntiForgeryToken()


2

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" />

vâng nếu bạn trên loại máy tính cục bộ <httpCookies domain = "localhost" /> thì chỉ trên cookie máy tính cục bộ mới hoạt động và nếu bạn cố mở trang web của mình trên máy khác, bạn sẽ nhập ip (fe 192.168.1.43) sẽ không hoạt động nó đang tìm kiếm "localhost"
user3419036

2

Trong trường hợp của tôi đó là do thêm requireSSL=trueđể httpcookiestrong 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@Html.AntiForgeryToken()công việc tôi đã thêm dòng này vào Application_BeginRequesttrongGlobal.asax

    protected void Application_BeginRequest(object sender, EventArgs e)
  {
    AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
  }

2

Đã 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:

nhập mô tả hình ảnh ở đây


Ok nó hoạt động. Nhưng điều này xảy ra nhiều lần. Trong Firefox cùng một dự án đang chạy đúng. Tôi có thể làm gì?
Có thể Ürek

@ CanÜrek Bạn có nhiều dự án / trang web khác nhau có cùng tên miền không? Ex localhost, app.site.com và app2.site.com vv? Nó thường xảy ra vì điều này.
Ogglas

0

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.


0

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ó.


0

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 đề


0

Đô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.


0

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();


Thí dụ

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)
    {
        ...
    }

Trong thực tế nếu bạn định nghĩa cấu trúc của lớp MyDto thì nó sẽ rất hữu ích
Chandan Kumar

Chà, tôi không chắc nó thực sự sẽ rất hữu ích và mã ví dụ đã mất từ ​​lâu rồi, vì vậy hãy nóipublic class MyDto { public bool Whatever { get; set; } }
demcodemonkey

-1

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) { ....

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.