Membership.create
ユーザー関数を使用していますが、次のエラーが発生しています、
偽造防止フォームフィールド "__RequestVerificationToken"は存在しません
どうすればこれを修正できますか?
あなたの行動の前に[ValidateAntiForgeryToken]
属性があります。フォームに@Html.AntiForgeryToken()
を追加する必要があります。
私の場合は、私のweb.configにこれがありました。
<httpCookies requireSSL="true" />
しかし私のプロジェクトはSSLを使用しないように設定されていました。その行をコメントアウトするか、常にSSLを使用するようにプロジェクトを設定すると、問題は解決しました。
このような:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
...
Code Block
...
}
@using(Html.BeginForm())
{
@Html.AntiForgeryToken()
<input name="..." type="text" />
// rest
}
[HttpGet]の下の[ValidateAntiForgeryToken]を使用しないでください。
[HttpGet]
public ActionResult MethodName()
{
..
}
Cookieが有効になっていない場合でもエラーが発生します。
これを引き起こす可能性があるもう1つのこと(これに遭遇しただけ)は次のとおりです。何らかの理由でフォーム内のすべての入力フィールドを無効にした場合。確認トークンを保持している隠し入力フィールドを無効にします。フォームがポストバックされるとき、トークン値はなくなり、欠けているというエラーが発生します。ですから、あなたがする必要があるのは検証トークンを保持する入力フィールドを再び有効にすることであり、すべてうまくいくでしょう。
リクエストの一部としてファイルをアップロードしている私たちのためのもう一つの可能性。コンテンツの長さがリクエスト検証トークンを使用している<httpRuntime maxRequestLength="size in kilo bytes" />
andを超えている場合、ブラウザはリクエストの長さを超えたメッセージの代わりに'The required anti-forgery form field "__RequestVerificationToken" is not present'
メッセージを表示します。
MaxRequestLengthを要求に応えるのに十分な大きさの値に設定することは当面の問題を解決します - それは私がそれが適切な解決策ではないことを認めるでしょう。
あなたのコントローラにあなたがあなたのhttp属性を持っていることを確認してください:
[HttpPost]
また、コントローラに属性を追加します。
[ValidateAntiForgeryToken]
あなたの見解であなたのフォームにあなたが書く必要があります:
@Html.AntiForgeryToken();
Html.AntiForgeryToken();がありました。コードブロック内に@記号がないと、Razorではエラーが発生しませんでしたが、実行時には発生しました。 @ Html.Antの@記号がないかどうかを確認してください。
私の場合は、この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);
});
…そしてそれはうまくいった。
私がそれを経験するのと同じ理由で誰かがエラーを経験するならば、これは私の解決策です:
Html.AntiForgeryToken();
があれば
@Html.AntiForgeryToken()
に変更してください
私の場合、web.configのCookieが正しくないドメインが原因でした。
<httpCookies domain=".wrong.domain.com" />
私の場合、それはwebconfigのhttpcookies
にrequireSSL=true
を追加したためにAntiForgeryTokenが機能しなくなったためです。例:
<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;
}
これはこれの最初の検索を思い付くので:
この問題はInternet Explorerでのみ発生し、問題が何であるかを理解できませんでした。つまり、私たちの(サブ)ドメインにはアンダースコアが含まれていたからです。 Chromeで動作しましたが、IE/Edgeはそれを好まなかったです。
いくつかのコントローラ上の私のEPiServerソリューションでは、HttpGetを受け付けるIndexアクションにContentOutputCache属性がありました。これらのアクションの各ビューには、同じコントローラまたは別のコントローラへのHttpPostアクションに送信されていたフォームが含まれていました。これらのすべてのインデックスアクションからその属性を削除するとすぐに、問題はなくなりました。
私の場合、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)
{
...
}
時々あなたは結果リストを持つフォームアクションメソッドを書いています。この場合、1つのアクションメソッドで作業することはできません。そのため、同じ名前の2つのアクションメソッドが必要です。 [HttpGet]
を持つものと[HttpPost]
属性を持つものです。
[HttpPost]
アクションメソッドで、[ValidateAntiForgeryToken]
属性を設定し、htmlフォームに@Html.AntiForgeryToken()
も配置します。
ここにある他のすべての答えも有効ですが、どれも問題を解決できない場合は、実際のヘッダーがサーバーに渡されていることを確認することも価値があります。
たとえば、nginxの背後にある負荷分散環境では、デフォルト設定はで、リクエストをサーバーに渡す前に__RequestVerificationTokenヘッダーを削除します。 単純なnginxリバースプロキシはいくつかのヘッダを削除するようです