필수 위조 방지 양식 필드 "__RequestVerificationToken"이 없습니다. 사용자 등록 오류


141

Membership.create사용자 기능을 사용 하고 있는데 다음 오류가 발생합니다.

필수 위조 방지 양식 필드 "__RequestVerificationToken"이 없습니다.

이 문제를 어떻게 해결할 수 있습니까?

답변:


218

당신은 [ValidateAntiForgeryToken]행동하기 전에 속성이 있습니다. 또한 @Html.AntiForgeryToken()양식에 추가해야합니다 .


11
같은 문제가있는 웹 페이지가 있지만 모든 것이 정확합니다. 무슨 실수 야?
ConductedClever

당신은주의 깊게이 문서에서 피들러 및 / 또는 불을 지르고 (모든 브라우저 개발 도구), 표정으로 모든 것을 (필드, 쿠키를) 확인해야 @ConductedClever : asp.net/web-api/overview/security/...을
webdeveloper

@ConductedClever 나도. 그것은 효과가 있지만 거의이 오류가 발생하지 않으며 왜 그런지 모르겠습니다.
QMaster

테스트에서 작동하는 클라이언트 컴퓨터에서 최근까지 작동했지만 모든 것이 정상이지만 이제는이 오류가 발생합니다. 왜 그런지 모르겠습니다. 여기에 나열된 것 이외의 다른 아이디어가 있습니까?
Andrei Dobrin

1
Html.AntiForgeryToken();작동하지 않습니다! 로 선반 @Html.AntiForgeryToken()작업
FindOutIslamNow

78

필자의 경우 web.config 에이 기능이 있습니다.

<httpCookies requireSSL="true" />

그러나 내 프로젝트는 SSL을 사용하지 않도록 설정되었습니다. 해당 라인을 주석 처리하거나 항상 SSL을 사용하도록 프로젝트를 설정하면 해결되었습니다.


3
필자의 경우 web.config에 requireSSL이 있었지만 포트 80과 443에 대한 IIS 바인딩이 있었으므로 https를 입력하는 사용자는 올바른 동작을 얻었고 http를 입력하는 사용자는이 오류가 발생하여 모두 다시 쓰기 규칙을 작성하여 https : /로 강제 설정했습니다. / {HTTP_HOST} / {R : 1} 수정
user1069816

고맙습니다 😃 제 경우 IIS에는이 바인딩 ( https » EmptyHostName » IP » 443)이 있었지만 ( )에 대한 바인딩이 없었습니다 https » www.mysite.com » IP » 443. 그래서 도메인비어 있지 않은 호스트 이름 을 가진 새로운 바인딩을 추가 하여 문제를 해결했습니다. 강제로 다시 쓰기 설정 이 있습니다. httpsIIShttp 2 https
RAM

61

이처럼 :

컨트롤러

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

보기:

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

HTML로만 사용해보십시오
Subrata Sarkar

41

또한 [HttpGet] 아래의 [ValidateAntiForgeryToken]을 사용하지 마십시오.

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

1
이 답변은 다른 사람들을 보완하고 내 문제를 해결했습니다! 감사합니다
Lucas

1
이 답변은 제출 된 데이터를 저장하지 않는다고 가정합니다 (HttpGet에 있지 않아야 함). 그렇다면 여전히 [ValidateAntiForgeryToken]이 제공하는 XSRF 보호가 필요합니다.
thelem

9

쿠키가 활성화되지 않은 경우에도 오류가 발생합니다.


2
잘 맞았습니다. Internet Explorer를 사용하고있었습니다. Chrome 브라우저를 사용하면 문제가 해결되었습니다.
FindOutIslamNow

이것은 내 문제도 해결했습니다. Google 크롬에서 쿠키를 사용하도록 설정합니다. 감사
과학적 방법

7

이 문제를 일으킬 수있는 또 다른 것은 다음과 같습니다. 어떤 이유로 든 양식에서 모든 입력 필드를 비활성화하십시오. 확인 토큰을 보유한 숨겨진 입력 필드를 비활성화합니다. 양식이 다시 게시되면 토큰 값이 누락되고 누락 된 오류가 생성됩니다. 따라서 확인 토큰을 보유한 입력 필드를 다시 활성화하면 모든 것이 잘됩니다.


6

요청의 일부로 파일을 업로드하는 사람들에게 또 다른 가능성. 콘텐츠 길이가 초과 <httpRuntime maxRequestLength="size in kilo bytes" /> 하고 요청 확인 토큰을 사용하는 경우 브라우저는 'The required anti-forgery form field "__RequestVerificationToken" is not present'요청 길이 초과 메시지 대신 메시지를 표시합니다 .

maxRequestLength를 요청에 맞게 충분히 큰 값으로 설정하면 즉각적인 문제가 해결되지만 적절한 해결책이 아니라는 것을 인정할 것입니다 (사용자는 요청 확인 토큰이 아닌 파일 크기의 실제 문제를 사용자가 알기를 원합니다).


5

컨트롤러에서 http 속성이 다음과 같은지 확인하십시오.

[HttpPost]

또한 컨트롤러에 속성을 추가하십시오.

[ValidateAntiForgeryToken]

당신의 관점에서 당신은 다음과 같이 작성해야합니다.

@Html.AntiForgeryToken();

나는 Html.AntiForgeryToken (); 코드 블록에있는 동안 @ 기호가 없으면 Razor에서 오류가 발생하지 않지만 런타임에 수행되었습니다. @ Html.Ant.의 @ 기호가 없는지 확인하십시오.


5

제 경우에는 제출 양식 에이 자바 스크립트가 있습니다.

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

제출 된 양식에서 숨겨진 RequestVerificationToken을 제거했습니다. 나는 그것을 다음과 같이 바꿨다.

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

... 그리고 잘 작동했습니다.


입력을 비활성화 할 때 안티 키가 어떻게 영향을 받는지 어떻게 알 수 있습니까?
Cer

1
@Cer-내가 어떻게 알았는지 물어 보면 피들러로 요청을 확인하고 키가 전송되지 않았 음을 알았습니다. 나는 Html 제출이 비활성화 된 컨트롤을 포함하지 않는다는 것을 읽었습니다. 그래서 나는 그것을 readonly숨겨진 컨트롤로 변경 하고 제외했습니다. 잘 작동하는 것 같습니다.
Sean

3

내가 왜 그런 이유로 같은 이유로 오류가 발생하면 여기 내 해결책이 있습니다.

당신이 있었다면 Html.AntiForgeryToken();

로 변경 @Html.AntiForgeryToken()


2

제 경우에는 쿠키에 대한 web.config의 잘못된 도메인이 그 이유였습니다.

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

응! 로컬 컴퓨터에 <httpCookies domain = "localhost"/> 유형 인 경우 로컬 컴퓨터 쿠키에서만 작동하며 다른 컴퓨터에서 사이트를 열려고하면 IP 주소 (fe 192.168.1.43)를 입력하면 처리되지 않습니다. "localhost"를 찾고 있습니다
user3419036

2

내 경우는 추가 때문 requireSSL=truehttpcookiesAntiForgeryToken 정지 작업을했다 webconfig에. 예:

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

둘 다 requireSSL=true만들고 @Html.AntiForgeryToken()일 하기 위해 안에이 줄을 추가 Application_BeginRequest했습니다.Global.asax

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

2

개별 사용자 계정으로 ASP.NET에 대한 기본 로그인으로 Chrome 에서이 오류가 발생했습니다.

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

제어 장치:

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

사이트의 사이트 데이터를 지우면 해결됩니다.

여기에 이미지 설명을 입력하십시오


괜찮습니다. 그러나 이것은 또 다시 일어나고 있습니다. Firefox에서 동일한 프로젝트가 올바르게 실행 중입니다. 어떡해?
Ürek

@ CanÜrek 도메인이 같은 여러 프로젝트 / 사이트가 있습니까? 예 localhost, app.site.com 및 app2.site.com 등? 일반적으로 이로 인해 발생합니다.
Ogglas

0

여러 컨트롤러의 EPiServer 솔루션에는 HttpGet을 허용하는 Index 작업에 ContentOutputCache 속성이 있습니다. 해당 조치에 대한 각보기에는 HttpPost 조치에 동일한 컨트롤러 또는 다른 컨트롤러에 게시하는 양식이 포함되어 있습니다. 모든 색인 작업 문제에서 해당 속성을 제거하자마자 사라졌습니다.


0

이것은 이것의 첫 번째 검색을 제공하기 때문에 :

Internet Explorer에서만이 문제가 발생했으며 문제가 무엇인지 파악할 수 없었습니다. 간단히 말해 우리의 (하위) 도메인에 밑줄이 있었기 때문에 토큰의 쿠키 부분을 저장하지 않았습니다. Chrome에서 작동했지만 IE / Edge는 마음에 들지 않았습니다.



0

때로는 결과 목록과 함께 양식 조치 메소드를 작성하고 있습니다. 이 경우 하나의 조치 방법으로 작업 할 수 없습니다. 따라서 동일한 이름을 가진 두 가지 조치 방법이 있어야합니다. 하나는 특성 이 [HttpGet]있고 다른 하나는 [HttpPost]특성이 있습니다.

당신의에서 [HttpPost]액션 메소드, 세트 [ValidateAntiForgeryToken]속성과도 넣어 @Html.AntiForgeryToken()당신의 HTML 형태로.


0

필자의 경우 AJAX 게시물을 작성하는 동안이 오류가 발생하여 __RequestVerificationToken 값이 호출에서 전달되지 않은 것으로 나타났습니다. 이 필드의 값을 수동으로 찾아서 엔드 포인트로 전송되는 데이터 객체의 속성으로 설정해야했습니다.

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


HTML

  <form id="myForm">
    @Html.AntiForgeryToken()

    <!-- other input fields -->

    <input type="submit" class="submitButton" value="Submit" />
  </form>

자바 스크립트

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

제어 장치

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

실제로 MyDto 클래스의 구조를 정의하면 도움이 될 것입니다
Chandan Kumar

그럼 난 실제로 매우 도움이 될 것입니다 확실하지 않다 및 예제 코드가 긴 이제 사라지고, 그래서하자의 말public class MyDto { public bool Whatever { get; set; } }
demoncodemonkey

-1

내가, 내가이 다음 한 주 광산에 싶습니다 방지 forgerytoken 튜토리얼 AngularJS와 함께 asp.net MVC 4를 사용하지만, 내가 사용 요청 예외 매번 발생 $ http.post와 난 그냥 추가되는 솔루션을 알아 냈어 'X- Requested-With ': $ http.post의 헤더에 대한 'XMLHttpRequest '(filterContext.HttpContext.Request.IsAjaxRequest()) 는 아약스로 인식되지 않는 것 같습니다 . 여기 예제 코드가 있습니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.