Membership.create
Kullanı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?
Membership.create
Kullanı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:
[ValidateAntiForgeryToken]
Eyleminizden önce özelliğiniz var . Ayrıca @Html.AntiForgeryToken()
formunuza eklemelisiniz .
Html.AntiForgeryToken();
çalışmıyor !! İçine Torna @Html.AntiForgeryToken()
eserleri
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ü.
IIS
bu 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 https
olmasıydı etki alanına eşit ve O sorunu çözdü. Ben de IIS
zorlamak için yeniden yazma ayarları var http 2 https
.
Bunun gibi:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
...
Code Block
...
}
@using(Html.BeginForm())
{
@Html.AntiForgeryToken()
<input name="..." type="text" />
// rest
}
Ayrıca [HttpGet] altında [ValidateAntiForgeryToken] kullanmamaya dikkat edin.
[HttpGet]
public ActionResult MethodName()
{
..
}
Çerezler etkin olmasa bile hatayı alırsınız.
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.
İ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).
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.
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ı.
readonly
gizli kontrolleri değiştirdim ve hariç tuttum . Güzel çalışıyor gibi görünüyor.
Benim durumumda web.config dosyasında çerezler için yanlış alan adı vardı:
<httpCookies domain=".wrong.domain.com" />
Benim durumumda bu eklemeden kaynaklandığını requireSSL=true
için httpcookies
AntiForgeryToken durdurma çalışma yapılmış WebConfig içinde. Misal:
<system.web>
<httpCookies httpOnlyCookies="true" requireSSL="true"/>
</system.web>
Her iki yapmak için requireSSL=true
ve @Html.AntiForgeryToken()
işe içimde bu satırı eklendi Application_BeginRequest
inGlobal.asax
protected void Application_BeginRequest(object sender, EventArgs e)
{
AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
}
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ü:
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.
Çü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.
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
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.
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();
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)
{
...
}
public class MyDto { public bool Whatever { get; set; } }
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)
{
....