O campo obrigatório do formulário anti-falsificação “__RequestVerificationToken” não está presente Erro no registro do usuário

141

Estou usando Membership.createa 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?

Hemant Soni
fonte

Respostas:

218

Você tem [ValidateAntiForgeryToken]atributo antes da sua ação. Você também deve adicionar @Html.AntiForgeryToken()em seu formulário.

webdeveloper
fonte
11
Eu tenho uma página da web que tem o mesmo problema, mas tudo está correto. qual é o erro?
ConductedClever
@ConductedClever Você deve verificar cuidadosamente tudo (campos, cookies) com o violinista e / ou o firebug (qualquer ferramenta de desenvolvimento de navegador), consulte este artigo: asp.net/web-api/overview/security/…
webdeveloper
@ConductedClever me também. Isso é trabalho, mas raramente obtém esse erro e eu não tenho nenhuma idéia POR QUE?
Qmaster
Eu tenho tudo ok, nos meus testes ele funciona, na máquina do cliente funcionou até recentemente, mas agora dá esse erro. Eu não tenho ideia do porquê. Alguém tem outras idéias além das listadas aqui, por favor?
Andrei Dobrin
1
Html.AntiForgeryToken();não funciona !! Transformando-se em @Html.AntiForgeryToken()obras
FindOutIslamNow
78

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.

Justin Skiles
fonte
3
No meu caso, o web.config tinha oSSSS, mas havia ligações do IIS para as portas 80 e 443, portanto, os usuários digitando https estavam obtendo um comportamento correto e os usuários digitando http estavam recebendo esse erro, criando uma regra de reescrita para forçar tudo a https: / / {HTTP_HOST} / {R: 1} corrigiu
user1069816
Obrigado 😃 No meu caso, IIShavia 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 httpsera igual ao domínio e resolveu o problema. Também reescrevi as configurações IISpara forçar http 2 https.
RAM
61

Como isso:

O controlador

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

A vista:

@using(Html.BeginForm())
{
     @Html.AntiForgeryToken()
     <input name="..." type="text" />
     // rest
}
Subrata Sarkar
fonte
Tente usar apenas em HTML
Subrata Sarkar 15/10
41

Além disso, evite usar [ValidateAntiForgeryToken] em [HttpGet].

  [HttpGet]
  public ActionResult MethodName()
  {
  ..
  }
Haiping Fan
fonte
1
Essa resposta complementou as outras e resolveu meu problema! Obrigado
Lucas
1
Esta resposta assume que você não está salvando nenhum dado enviado (que não deveria estar em um HttpGet). Se você estiver, ainda precisará da proteção XSRF fornecida pelo [ValidateAntiForgeryToken].
Thelem
9

Você receberá o erro mesmo quando os cookies não estiverem ativados.

Vijaychandar
fonte
2
Boa batida. Eu estava usando o Internet Explorer. Usando o navegador Chrome resolveu o problema para mim
FindOutIslamNow
Isso também resolveu o meu problema. ativar cookies no google chrome. Obrigado
The Scientific Method
7

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.

romano
fonte
6

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

GeoffM
fonte
5

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

juFo
fonte
5

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.

Sean
fonte
Como você percebeu que a chave anti era afetada quando você desabilitou as entradas?
Cer
1
@ Cer - se você está perguntando como eu notei, verifiquei o pedido com o violinista e peguei que a chave não estava sendo enviada. Eu li que o envio de HTML não inclui controles desativados. Então eu mudei para readonlye excluí os controles ocultos. Parece funcionar bem.
21417 Sean
3

Se alguém experimenta o erro pela mesma razão pela qual o experimento, aqui está minha solução:

se você tinha Html.AntiForgeryToken();

mude para @Html.AntiForgeryToken()

Winnifred
fonte
2

No meu caso, o domínio incorreto no web.config para cookies foi o motivo:

<httpCookies domain=".wrong.domain.com" />
Michael Logutov
fonte
Sim! se você no computador local digitar <httpCookies domain = "localhost" />, somente os cookies do computador local funcionarão e se você tentar abrir o site em outra máquina, digitará o IP (fe 192.168.1.43) que não funcionará procurando "localhost"
user3419036 20/02/19
2

No meu caso, foi devido a adição requireSSL=truede httpcookiesno webconfig que fez a parada de trabalho AntiForgeryToken. Exemplo:

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

Para fazer tanto requireSSL=truee @Html.AntiForgeryToken()trabalhar eu adicionei esta linha dentro do Application_BeginRequestemGlobal.asax

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

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:

insira a descrição da imagem aqui

Ogglas
fonte
Ok, deu certo. Mas isso está acontecendo de novo e de novo. No Firefox, o mesmo projeto está sendo executado corretamente. O que eu posso fazer?
Can Ürek 16/03
@ CanÜrek Você tem vários projetos / sites diferentes com o mesmo domínio? Ex host local, app.site.com e app2.site.com etc? Isso normalmente acontece por causa disso.
Ogglas 16/03
0

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.

Goran Sneperger
fonte
0

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.

kevhann80
fonte
0

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

Doug
fonte
0

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

Masoud Darvishian
fonte
0

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


Exemplo

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)
    {
        ...
    }
demoncodemonkey
fonte
De fato, se você definir a estrutura da sua classe MyDto, será muito útil
Chandan Kumar 24/06
Bem, eu não tenho certeza se isso será realmente muito útil e que o código de exemplo já se foi há muito tempo, então vamos dizerpublic class MyDto { public bool Whatever { get; set; } }
demoncodemonkey
-1

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

Ran Lorch
fonte