Gerekli sahtecilikle mücadele formu alanı “__RequestVerificationToken” mevcut değil Kullanıcı Kaydında Hata


141

Membership.createKullanıcı işlevini kullanıyorum , sonra aşağıdaki hata oluşuyor,

Gerekli sahtecilik önleme form alanı "__RequestVerificationToken" mevcut değil

Bunu nasıl düzeltebilirim?

Yanıtlar:


218

[ValidateAntiForgeryToken]Eyleminizden önce özelliğiniz var . Ayrıca @Html.AntiForgeryToken()formunuza eklemelisiniz .


11
Aynı soruna sahip bir web sayfam var ama her şey doğru. hata nedir.
ConductedClever

Dikkatli bu makalede de fiddler ve / veya kundakçı (herhangi bir tarayıcı dev araçları), bakışla her şeyi (alanlar, çörek) kontrol etmelidir @ConductedClever: asp.net/web-api/overview/security/...
webdeveloper

Beni de düşün. Bu iş ama nadiren bu hatayı almak ve neden herhangi bir fikrim yok?
QMaster

Herşey yolunda, testlerimde çalışıyor, bir müşterinin makinesinde yakın zamana kadar çalıştı, ama şimdi bu hatayı veriyor. Neden olduğuna dair hiçbir fikrim yok. Burada listelenenlerden başka fikirleri olan var mı?
Andrei Dobrin

1
Html.AntiForgeryToken();çalışmıyor !! İçine Torna @Html.AntiForgeryToken()eserleri
FindOutIslamNow

78

Benim durumumda, bunu web.config dosyamda vardı:

<httpCookies requireSSL="true" />

Ancak projem SSL kullanmayacak şekilde ayarlandı. Bu satırı yorumlamak veya projeyi her zaman SSL kullanacak şekilde ayarlamak sorunu çözdü.


3
Benim durumumda, web.config dosyasıSSL'ye sahipti, ancak hem bağlantı noktası 80 hem de 443 için IIS bağlamaları vardı, bu nedenle https yazan kullanıcılar doğru davranışa sahipti ve http yazan kullanıcılar bu hatayı alıp hepsini https'ye zorlamak için bir yeniden yazma kuralı koyuyorlar: / / {HTTP_HOST} / {R: 1}
sorunu çözdü

Teşekkür ederim case Benim durumumda IISbu bağlama ( https » EmptyHostName » IP » 443) vardı ama ( https » www.mysite.com » IP » 443) için bir bağlama yoktu . Ben ile bağlayıcı yeni eklenen Yani boş olmayan ana bilgisayar adı için httpsolmasıydı etki alanına eşit ve O sorunu çözdü. Ben de IISzorlamak için yeniden yazma ayarları var http 2 https.
RAM

61

Bunun gibi:

Kontrol eden, denetleyici

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

Görünüm:

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

Yalnızca HTML'de kullanmayı deneyin
Subrata Sarkar

41

Ayrıca [HttpGet] altında [ValidateAntiForgeryToken] kullanmamaya dikkat edin.

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

1
Bu cevap diğerlerini tamamladı ve sorunumu çözdü! Teşekkürler
Lucas

1
Bu yanıt, gönderilen verileri (HttpGet'te olmamalısınız) kaydetmediğinizi varsayar. Eğer öyleyseniz, [ValidateAntiForgeryToken] tarafından sağlanan XSRF korumasına hala ihtiyacınız vardır.
thelem

9

Çerezler etkin olmasa bile hatayı alırsınız.


2
İyi vuruş. Internet Explorer kullanıyordum. Chrome tarayıcı kullanmak sorunu benim için çözdü
FindOutIslamNow

Bu benim sorunumu da çözdü. google chrome'da çerezleri etkinleştirme. Teşekkürler
Bilimsel Yöntem

7

Buna neden olabilecek başka bir şey (sadece bununla karşılaştı) şudur: herhangi bir nedenle formunuzdaki tüm giriş alanlarınızı devre dışı bırakırsanız. doğrulama simgenizi tutan gizli giriş alanını devre dışı bırakır. form geri gönderildiğinde jeton değeri eksik olur ve eksik hatayı oluşturur. bu yüzden yapmanız gereken, doğrulama jetonunu tutan giriş alanını yeniden etkinleştirmektir ve her şey yolunda olacaktır.


6

İsteğin bir parçası olarak dosya yüklememiz için başka bir olasılık. İçerik uzunluğu aşılırsa <httpRuntime maxRequestLength="size in kilo bytes" /> ve istek doğrulama jetonlarını kullanıyorsanız tarayıcı 'The required anti-forgery form field "__RequestVerificationToken" is not present', istek uzunluğu aşıldı mesajı yerine mesajı görüntüler.

MaxRequestLength, istek için yiyecek ve içecek sağlamak için yeterince büyük bir değere ayarlanırsa, bu sorunu giderir - bunun uygun bir çözüm olmadığını itiraf edeyim (kullanıcının dosya doğrulama sorununun eksik olduğunu değil, dosya boyutu ile ilgili gerçek sorunu bilmesini istiyoruz).


5

Denetleyicinizde http özelliğinizin olduğundan emin olun:

[HttpPost]

özelliği denetleyiciye de ekleyin:

[ValidateAntiForgeryToken]

Sizin görüşünüze göre formunuzda şunları yazmalısınız:

@Html.AntiForgeryToken();

Html.AntiForgeryToken () vardı; kod bloğundayken @ işareti olmadan, Razor'da bir hata vermedi, ancak çalışma zamanında yaptı. Eksik veya eksikse @ Html.Ant .. 'ın @ işaretine baktığınızdan emin olun.


5

Benim durumumda, form üzerinde bu javascript vardı:

$('form').submit(function () {
    $('input').prop('disabled', true);
});

Bu, gizli RequestVerificationToken'ı gönderilen formdan kaldırıyordu. Bunu şu şekilde değiştirdim:

$('form').submit(function () {
    $('input[type=submit]').prop('disabled', true);
    $('input[type=text]').prop('readonly', true);
    $('input[type=password]').prop('readonly', true);
});

... ve işe yaradı.


Girişleri devre dışı bıraktığınızda anahtarın etkilendiğini nasıl fark ettiniz?
Cer

1
@Cer - nasıl fark ettiğimi soruyorsanız, isteği kemancı ile kontrol ettim ve anahtarın gönderilmediğini aldım. Html'nin gönderdiği dosyaların devre dışı bırakılmış denetimleri içermediğini okudum. Böylece readonlygizli kontrolleri değiştirdim ve hariç tuttum . Güzel çalışıyor gibi görünüyor.
Sean

3

Birisi hatayı aynı nedenden dolayı deneyimliyorsam, işte benim çözümüm:

olsaydı Html.AntiForgeryToken();

olarak değiştir @Html.AntiForgeryToken()


2

Benim durumumda web.config dosyasında çerezler için yanlış alan adı vardı:

<httpCookies domain=".wrong.domain.com" />

yeep! yerel bilgisayar türünde <httpCookies domain = "localhost" /> yazarsanız, yalnızca yerel bilgisayar çerezlerinde çalışır ve sitenizi başka bir makinede açmaya çalışırsanız, buna neden olmayacak ip (fe 192.168.1.43) girersiniz. "localhost" arıyor
user3419036

2

Benim durumumda bu eklemeden kaynaklandığını requireSSL=trueiçin httpcookiesAntiForgeryToken durdurma çalışma yapılmış WebConfig içinde. Misal:

<system.web>
  <httpCookies httpOnlyCookies="true" requireSSL="true"/>
</system.web>

Her iki yapmak için requireSSL=trueve @Html.AntiForgeryToken()işe içimde bu satırı eklendi Application_BeginRequestinGlobal.asax

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

2

Bireysel Kullanıcı Hesapları ile ASP.NET için varsayılan giriş ile Chrome'da bu hatayı aldım

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

Denetleyici:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)

Site için site verilerini temizleyerek çözüldü:

resim açıklamasını buraya girin


Tamam çalıştı. Ama bu tekrar tekrar oluyor. Firefox'ta aynı proje düzgün çalışıyor. Ne yapabilirim?
Can Ürek

@ CanÜrek Aynı alana sahip birkaç farklı projeniz / siteniz var mı? Eski localhost, app.site.com ve app2.site.com vb. Normalde bundan dolayı olur.
Ogglas

0

Birkaç denetleyicideki EPiServer çözümümde, HttpGet'i kabul eden Dizin eyleminde bir ContentOutputCache özniteliği vardı. Bu eylemlerin her görünümü, aynı denetleyiciye veya farklı bir denetleyiciye bir HttpPost eylemine gönderme yapan bir form içeriyordu. Bu özniteliği tüm bu Index eylemlerinden kaldırır kaldırmaz gider.


0

Çünkü bu, bunun ilk araştırmasıyla ortaya çıkıyor:

Bu sorunu sadece Internet Explorer'da yaşadım ve sorunun ne olduğunu anlayamadım. Uzun lafın kısası, Token'ın çerez bölümünü kaydetmiyordu, çünkü (alt) alanımızın bir alt çizgisi vardı. Chrome'da çalıştı ancak IE / Edge beğenmedi.


0

Buradaki diğer tüm cevaplar da geçerlidir, ancak hiçbiri sorunu çözmezse, gerçek başlıkların sunucuya iletildiğini kontrol etmeye değer.

Örneğin, nginx'in arkasındaki yük dengeli bir ortamda, varsayılan yapılandırma, isteği sunucuya iletmeden önce __RequestVerificationToken üstbilgisini çıkarmaktır, bkz: basit nginx ters proxy'si bazı başlıkları şeritliyor gibi görünüyor


0

Bazen bir sonuç listesi içeren bir form eylemi yöntemi yazıyorsunuz. Bu durumda, bir eylem yöntemiyle çalışamazsınız. Bu yüzden aynı ada sahip iki eylem yönteminiz olması gerekir. Biri [HttpGet]ve diğeri ile[HttpPost] özniteliği.

Senin içinde [HttpPost]eylem yöntemi, ayarlanan [ValidateAntiForgeryToken]özniteliği ve ayrıca koymak @Html.AntiForgeryToken()Html şeklinde.


0

Benim durumumda bir AJAX gönderisi yaparken bu hatayı alıyordum, __RequestVerificationToken değerinin çağrıda geçmediği ortaya çıktı. El ile bu alanın değerini bulmak ve bu bitiş noktasına gönderilen veri nesnesinde bir özellik olarak ayarlamak zorunda kaldı.

yani data.__RequestVerificationToken = $('input[name="__RequestVerificationToken"]').val();


Misal

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

kontrolör

    [HttpPost]
    [Route("myUrl")]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> MyUrlAsync(MyDto dto)
    {
        ...
    }

Aslında MyDto sınıfınızın yapısını tanımlayacaksanız çok yardımcı olacaktır
Chandan Kumar

Aslında çok yararlı olacağından emin değilim ve örnek kod uzun zamandır gitti, bu yüzden diyelimpublic class MyDto { public bool Whatever { get; set; } }
demoncodemonkey

-1

benim paylaşmak istiyorum, ben angularjs ile asp.net mvc 4 kullanarak bu anti forgerytoken öğretici takip ediyor, ama ben $ http.post kullanarak talep her zaman bir istisna atar ve çözüm sadece 'X- eklemek olduğunu düşündüm Requested-With ':' XMLHttpRequest ' $ http.post üstbilgilerine, çünkü (filterContext.HttpContext.Request.IsAjaxRequest()) ajax olarak tanımıyor gibi görünüyor ve işte benim örnek kod.

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


SaveController

[HttpPost] [MyValidateAntiForgeryToken] public ActionResult User(UserModel usermodel) { ....

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.