Estou usando Membership.create
a função de usuário, o seguinte erro está ocorrendo,
O campo obrigatório do formulário anti-falsificação "__RequestVerificationToken" não está presente
Como posso consertar isso?
Estou usando Membership.create
a função de usuário, o seguinte erro está ocorrendo,
O campo obrigatório do formulário anti-falsificação "__RequestVerificationToken" não está presente
Como posso consertar isso?
Respostas:
Você tem [ValidateAntiForgeryToken]
atributo antes da sua ação. Você também deve adicionar @Html.AntiForgeryToken()
em seu formulário.
Html.AntiForgeryToken();
não funciona !! Transformando-se em @Html.AntiForgeryToken()
obras
No meu caso, eu tinha isso no meu web.config:
<httpCookies requireSSL="true" />
Mas meu projeto foi definido para não usar SSL. Comentar essa linha ou configurar o projeto para sempre usar SSL resolveu a questão.
IIS
havia essa ligação ( https » EmptyHostName » IP » 443
), mas não havia uma ligação para ( https » www.mysite.com » IP » 443
). Então, adicionei uma nova ligação com um nome de host não vazio, pois https
era igual ao domínio e resolveu o problema. Também reescrevi as configurações IIS
para forçar http 2 https
.
Como isso:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
...
Code Block
...
}
@using(Html.BeginForm())
{
@Html.AntiForgeryToken()
<input name="..." type="text" />
// rest
}
Além disso, evite usar [ValidateAntiForgeryToken] em [HttpGet].
[HttpGet]
public ActionResult MethodName()
{
..
}
Você receberá o erro mesmo quando os cookies não estiverem ativados.
Outra coisa que pode causar isso (acabei de descobrir isso) é o seguinte: se, por algum motivo, você desabilitar todos os seus campos de entrada no seu formulário. ele desativará o campo de entrada oculto que contém seu token de verificação. quando o formulário for postado de volta, o valor do token estará ausente e gerará o erro que está faltando. portanto, o que você precisa fazer é reativar o campo de entrada que contém o token de verificação e tudo ficará bem.
Outra possibilidade para nós carregar arquivos como parte da solicitação. Se o comprimento do conteúdo exceder <httpRuntime maxRequestLength="size in kilo bytes" />
e você estiver usando tokens de verificação de solicitação, o navegador exibirá a 'The required anti-forgery form field "__RequestVerificationToken" is not present'
mensagem em vez da mensagem excedida.
Definir maxRequestLength como um valor grande o suficiente para atender à solicitação cura o problema imediato - embora eu admita que não é uma solução adequada (queremos que o usuário conheça o verdadeiro problema do tamanho do arquivo, não o de falta de tokens de verificação de solicitação).
Verifique se no seu controlador você tem seu atributo http como:
[HttpPost]
adicione também o atributo no controlador:
[ValidateAntiForgeryToken]
No seu formulário, na sua opinião, você deve escrever:
@Html.AntiForgeryToken();
Eu tinha Html.AntiForgeryToken (); sem o sinal @ enquanto estava em um bloco de código, não deu um erro no Razor, mas ocorreu em tempo de execução. Verifique o sinal @ de @ Html.Ant .. se ele estiver ausente ou não
No meu caso, eu enviei este javascript no formulário:
$('form').submit(function () {
$('input').prop('disabled', true);
});
Isso estava removendo o RequestVerificationToken oculto do formulário que está sendo enviado. Eu mudei isso para:
$('form').submit(function () {
$('input[type=submit]').prop('disabled', true);
$('input[type=text]').prop('readonly', true);
$('input[type=password]').prop('readonly', true);
});
... e funcionou bem.
readonly
e excluí os controles ocultos. Parece funcionar bem.
No meu caso, o domínio incorreto no web.config para cookies foi o motivo:
<httpCookies domain=".wrong.domain.com" />
No meu caso, foi devido a adição requireSSL=true
de httpcookies
no webconfig que fez a parada de trabalho AntiForgeryToken. Exemplo:
<system.web>
<httpCookies httpOnlyCookies="true" requireSSL="true"/>
</system.web>
Para fazer tanto requireSSL=true
e @Html.AntiForgeryToken()
trabalhar eu adicionei esta linha dentro do Application_BeginRequest
emGlobal.asax
protected void Application_BeginRequest(object sender, EventArgs e)
{
AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
}
Este erro ocorreu no Chrome com o login padrão do ASP.NET com contas de usuário individuais
.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>
Controlador:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
Resolvido limpando os dados do site:
Na minha solução EPiServer em vários controladores, havia um atributo ContentOutputCache na ação Index que aceitava HttpGet. Cada visualização dessas ações continha um formulário que estava sendo postado em uma ação HttpPost no mesmo controlador ou em um diferente. Assim que eu removi esse atributo de todas essas ações de índice, o problema desapareceu.
Porque isso vem com a primeira pesquisa disso:
Eu tinha esse problema apenas no Internet Explorer e não conseguia descobrir qual era o problema. Para encurtar a história, não estava salvando a parte do cookie do Token porque nosso (sub) domínio tinha um sublinhado. Funcionou no Chrome, mas o IE / Edge não gostou.
Todas as outras respostas aqui também são válidas, mas se nenhuma delas resolver o problema, também vale a pena verificar se os cabeçalhos reais estão sendo passados para o servidor.
Por exemplo, em um ambiente com balanceamento de carga atrás do nginx, a configuração padrão é remover o cabeçalho __RequestVerificationToken antes de passar a solicitação ao servidor, consulte: o proxy reverso simples do nginx parece remover alguns cabeçalhos
Às vezes, você está escrevendo um método de ação de formulário com uma lista de resultados. Nesse caso, você não pode trabalhar com um método de ação. Então você precisa ter dois métodos de ação com o mesmo nome. Um com [HttpGet]
e outro com [HttpPost]
atributo.
No seu [HttpPost]
método de ação, defina o [ValidateAntiForgeryToken]
atributo e também coloque @Html.AntiForgeryToken()
no seu formulário html.
No meu caso, eu estava recebendo esse erro ao fazer uma postagem no AJAX, mas o valor __RequestVerificationToken não estava sendo passado na chamada. Eu tive que encontrar manualmente o valor desse campo e configurá-lo como uma propriedade no objeto de dados que é enviado para o terminal.
ie
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
});
Controlador
[HttpPost]
[Route("myUrl")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> MyUrlAsync(MyDto dto)
{
...
}
public class MyDto { public bool Whatever { get; set; } }
Eu gostaria de compartilhar o meu, eu tenho seguido este tutorial anti-falsificação
usando asp.net mvc 4 com angularjs, mas lança uma exceção sempre que solicito usando $ http.post e descobri que a solução é apenas adicionar
'X- Requested-With ':' XMLHttpRequest ' para os cabeçalhos de $ http.post, porque parece que o (filterContext.HttpContext.Request.IsAjaxRequest())
não o reconhece como ajax e aqui está o meu código de exemplo.
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)
{
....