必要な偽造防止フォームフィールド「__RequestVerificationToken」が存在しないユーザー登録のエラー


141

Membership.createユーザー関数を使用していますが、次のエラーが発生しています。

必須の偽造防止フォームフィールド「__RequestVerificationToken」がありません

どうすれば修正できますか?

回答:


218

[ValidateAntiForgeryToken]アクションの前に属性があります。また@Html.AntiForgeryToken()、フォームに追加する必要があります。


11
同じ問題があるウェブページがありますが、すべてが正しいです。間違いです。
ConductedClever

あなたは慎重にシオマネキおよび/または放火魔で(任意のブラウザdevのツールを)すべて(フィールド、クッキー)を確認する必要があり@ConductedClever、この記事を見て:asp.net/web-api/overview/security/...
webdeveloper

@ConductedClever私も。それは仕事ですが、このエラーが発生することはめったになく、なぜ私には何の考えもありませんか?
QMaster、2014

私はすべてが大丈夫ですが、私のテストでは、それが機能するクライアントのマシンで最近まで機能していましたが、今ではこのエラーが発生します。なぜか分かりません。ここに記載されているアイデア以外のアイデアはありますか?
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

ありがとうmy私の場合、IISこのバインディング(https » EmptyHostName » IP » 443)はありましたが、(https » www.mysite.com » IP » 443)のバインディングはありませんでした。そこで、空ではないホスト名を使用httpsした新しいバインディングを追加しました。これはドメイン同じであり、問題を解決しました。私もIIS強制的に設定を書き換えましたhttp 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
この答えは他のものを補完し、私の問題を解決しました!おかげで
ルーカス

1
この回答は、送信されたデータを保存しないことを前提としています(HttpGetに含めることはできません)。そうであれば、[ValidateAntiForgeryToken]が提供するXSRF保護が必要です。
thelem

9

Cookieが有効になっていない場合でもエラーが発生します。


2
大ヒット。Internet Explorerを使用していました。Chromeブラウザを使用して問題を解決した
FindOutIslamNow 2017年

これも私の問題を解決しました。Google ChromeでCookieを有効にします。ありがとう
科学的方法

7

これを引き起こす可能性のあるもう1つの原因は、次のとおりです(何らかの理由でフォームのすべての入力フィールドを無効にした場合)。確認トークンを保持する非表示の入力フィールドを無効にします。フォームがポストバックされると、トークン値が欠落し、欠落しているというエラーが発生します。したがって、確認トークンを保持する入力フィールドを再度有効にする必要があります。


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

私の場合、送信フォームに次のJavaScriptが含まれています。

$('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のcookieのドメインが正しくないことが原因でした。

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

うん!ローカルコンピューターで<httpCookies domain = "localhost" />と入力すると、ローカルコンピューターのCookieのみが機能し、他のマシンでサイトを開こうとすると、IP(fe 192.168.1.43)と入力されます。 「localhost」を探しています
user3419036

2

私の場合、AntiForgeryTokenが機能しなくなったのは、webconfig に追加requireSSL=truehttpcookiesたためです。例:

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

両方を作るにrequireSSL=trueして@Html.AntiForgeryToken()働く私は内部でこの行を追加Application_BeginRequestGlobal.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同じドメインを持つ複数の異なるプロジェクト/サイトがありますか?ex localhost、app.site.com、app2.site.comなど?これは通常、このために発生します。
オグラス

0

いくつかのコントローラー上の私のEPiServerソリューションでは、HttpGetを受け入れるIndexアクションにContentOutputCache属性がありました。これらのアクションの各ビューには、同じコントローラーまたは別のコントローラーへのHttpPostアクションに投稿するフォームが含まれていました。それらすべてのインデックスアクションからその属性を削除するとすぐに、問題はなくなりました。


0

これはこれの最初の検索を思い付くので:

この問題はInternet Explorerでのみ発生し、問題の内容を理解できませんでした。要するに、私たちの(サブ)ドメインにアンダースコアが含まれているため、トークンのCookie部分は保存されませんでした。Chromeで動作しましたが、IE / Edgeは気に入らなかった。


0

ここでの他のすべての回答も有効ですが、どれも問題を解決しない場合は、実際のヘッダーがサーバーに渡されていることを確認することも価値があります。

たとえば、nginxの背後にある負荷分散環境では、デフォルトの構成では、リクエストをサーバーに渡す前に__RequestVerificationTokenヘッダー削除します。参照:単純なnginxリバースプロキシは一部のヘッダーを削除するようです


0

時々、結果リストを持つフォームアクションメソッドを書いています。この場合、1つのアクションメソッドで作業することはできません。したがって、同じ名前の2つのアクションメソッドが必要です。1つは属性付き[HttpGet]、もう1つは[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>

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

コントローラ

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

実際、MyDtoクラスの構造を定義すると、非常に役立ちます
Kumar

まあ、私はそれが実際には非常に参考になるか分からないとサンプルコードが長く、今なくなっているので、聞かせてのは言うpublic class MyDto { public bool Whatever { get; set; } }
demoncodemonkey

-1

私は私のものを共有したいのですが、 asp.net mvc 4とangularjsを使用してこの偽造防止チュートリアル実行してきましたが、$ http.postを使用して要求するたびに例外がスローされ、解決策は 'X- Requested-With ': $ http.postのヘッダーに対する' XMLHttpRequest '(filterContext.HttpContext.Request.IsAjaxRequest()) 。これは、それがajaxとして認識されないようで、ここに私のサンプルコードがあります。

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.