回答:
[ValidateAntiForgeryToken]
アクションの前に属性があります。また@Html.AntiForgeryToken()
、フォームに追加する必要があります。
Html.AntiForgeryToken();
動作しません !!回す@Html.AntiForgeryToken()
作品
私の場合、これは私のweb.configにありました:
<httpCookies requireSSL="true" />
しかし、私のプロジェクトはSSLを使用しないように設定されていました。その行をコメント化するか、常にSSLを使用するようにプロジェクトを設定することで解決しました。
IIS
このバインディング(https » EmptyHostName » IP » 443
)はありましたが、(https » www.mysite.com » IP » 443
)のバインディングはありませんでした。そこで、空ではないホスト名を使用https
した新しいバインディングを追加しました。これはドメインと同じであり、問題を解決しました。私もIIS
強制的に設定を書き換えましたhttp 2 https
。
このような:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
...
Code Block
...
}
@using(Html.BeginForm())
{
@Html.AntiForgeryToken()
<input name="..." type="text" />
// rest
}
Cookieが有効になっていない場合でもエラーが発生します。
私たちがリクエストの一部としてファイルをアップロードする別の可能性。コンテンツの長さが超過し<httpRuntime maxRequestLength="size in kilo bytes" />
、リクエスト検証トークンを使用している場合、ブラウザ'The required anti-forgery form field "__RequestVerificationToken" is not present'
はリクエストの長さ超過メッセージの代わりにメッセージを表示します。
maxRequestLengthをリクエストに対応するのに十分な大きさの値に設定すると、当面の問題が解決します-これは適切な解決策ではないことを認めます(ユーザーに、リクエストの検証トークンの欠落の問題ではなく、ファイルサイズの真の問題を知ってもらいたいと思います)。
私の場合、送信フォームに次の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);
});
...そしてそれはうまくいきました。
readonly
、非表示のコントロールを除外しました。うまく機能しているようです。
私の場合、web.configのcookieのドメインが正しくないことが原因でした。
<httpCookies domain=".wrong.domain.com" />
私の場合、AntiForgeryTokenが機能しなくなったのは、webconfig に追加requireSSL=true
しhttpcookies
たためです。例:
<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;
}
個人ユーザーアカウントを使用した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)
サイトのサイトデータをクリアすることで解決:
いくつかのコントローラー上の私のEPiServerソリューションでは、HttpGetを受け入れるIndexアクションにContentOutputCache属性がありました。これらのアクションの各ビューには、同じコントローラーまたは別のコントローラーへのHttpPostアクションに投稿するフォームが含まれていました。それらすべてのインデックスアクションからその属性を削除するとすぐに、問題はなくなりました。
ここでの他のすべての回答も有効ですが、どれも問題を解決しない場合は、実際のヘッダーがサーバーに渡されていることを確認することも価値があります。
たとえば、nginxの背後にある負荷分散環境では、デフォルトの構成では、リクエストをサーバーに渡す前に__RequestVerificationTokenヘッダーを削除します。参照:単純なnginxリバースプロキシは一部のヘッダーを削除するようです
時々、結果リストを持つフォームアクションメソッドを書いています。この場合、1つのアクションメソッドで作業することはできません。したがって、同じ名前の2つのアクションメソッドが必要です。1つは属性付き[HttpGet]
、もう1つは[HttpPost]
属性付きです。
あなたのでは[HttpPost]
アクションメソッド、セット[ValidateAntiForgeryToken]
属性とも入れて@Html.AntiForgeryToken()
、あなたのHTMLフォームで。
私の場合、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)
{
...
}
public class MyDto { public bool Whatever { get; set; } }
私は私のものを共有したいのですが、
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)
{
....