コアmvcプロジェクトで偽造防止機能を有効にしようとしましたが、運がありません。実行されたこと:ASP.NETコアMVC偽造防止
POST要求ごとに自動的に反偽造トークンをチェックするようにフィルタが追加されました。
services.AddMvc(o =>
{
o.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
});
このように各ページにトークンの生成が追加されました。
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Antiforgery;
@{
var antiforgeryRequestToken = Antiforgery.GetAndStoreTokens(Context).RequestToken;
}
...
...
<script>
var antiforgeryToken = @Json.Serialize(antiforgeryRequestToken);
</script>
最後に、各クライアントのajaxリクエストは、このようにRequestVerificationToken
を追加します。
var options = {
url: o.url, type: 'POST', data: o.params, headers: { 'RequestVerificationToken': antiforgeryToken } };
各Ajaxリクエストにトークンがあるのがわかりますが、私はいつもPOSTリクエストで400を得ています。フィルタを無効にすると、正常に動作します。しかし、私はそれを有効にすると、asp.netコアはPOST要求ごとに検証を開始し、それは常に私に400を返します。
アイデア?
UPDATE:
私はコメントで得た指示に従ってきたし、今のコードは次のようになります。 ConfigureServices方法:
services.AddMvc(o => {
o.Filters.Add(new HandleAllExceptionsFilterFactory());
o.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
});
services.AddAntiforgery(o => o.CookieName = "XSRF-TOKEN");
そして、ここでは、登録されたミドルウェアです:
app.Use(next => context => {
if (context.Request.Path == "/")
{
var antiforgery = app.ApplicationServices.GetService<IAntiforgery>();
var token = antiforgery.GetAndStoreTokens(context);
context.Response.Cookies.Append("XSRF-TOKEN", token.RequestToken, new CookieOptions {HttpOnly = false});
}
return next(context);
});
私はまた、任意のクライアント側に前のヘッダを送信されたJavaScriptコードを削除しました。しかし、それはまだ動作しません。
これは 'data:{__RequestVerificationToken:antiforgeryToken}'である必要があります。 – tchelidze
ヘッダー名を 'RequestVerificationToken'から' __RequestVerificationToken'に変更する必要がありますか? –
だけでなく、トークンは 'data'になければなりません。それがうまくいくか試してみてください。 – tchelidze