(グローバルで設定してください。CS):
AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;
この
は、二重ログインの問題のために、第2の提出を停止するために提出し、元の日付と時刻を文書化するためのスクリプトを使用しようと、自分のトークンに名前識別子が追加されます同じトークンで
// jQuery plugin to prevent double submission of forms
jQuery.fn.preventDoubleSubmission = function() {
$(this).on('submit',function(e){
var $form = $(this);
if ($form.data('submitted') === true) {
// Previously submitted - don't submit again
e.preventDefault();
} else {
// Mark it so that the next submit can be ignored
$form.data('submitted', true);
}
});
// Keep chainability
return this;
};
私たちは1つのことを知っています。バックボタンのようなユーザーはダブルクリックの習慣がありますが、これはAntiforgeryTokenの大きな問題です。
しかし、あなたのアプリケーションが何をするかによって、そのように強制する方法があります。最も簡単なのは、訪問者が自分の要求を「巻き戻す」必要があるように感じさせないようにすることです。
ユーザーが何が間違っているかを確認するには、フォームエラーメッセージが明確かつ簡潔であることを確認してください。文脈上の誤りはボーナスポイントを与える。
フォーム提出の間は常にフォームの状態を維持してください。 のパスワードやクレジットカード番号の他に、MVC フォームヘルパーには感謝の気持ちがありません。形態は、このようなエラーは、実際に フォームの送信に由来することがスマートであると コントローラレイアウトを表示又は形成する、角又はember.js等 SPAフレームワークで使用されるようなタブまたは隠しdiv要素に分散している場合@Html.LabelFor(x => x.FirstName)
エラーを表示するとき。 をホームコントローラまたは最初のタブに転送しないでください。
「何が起こっているの?」 - AntiForgeryTokenはあなたのウェブサイトがタイプSystem.Web.Mvc.HttpAntiForgeryExceptionの例外がスローされます検証しない場合は、ユーザーを維持するには、
を知らせました。
正しく設定した場合は、フレンドリーなエラーがオンになり、エラーページには例外が表示されず、何が起きているかを示す素晴らしいエラーページが表示されます。
少なくとも、HttpAntiForgeryExceptionをキャッチすることで、これらの例外をターゲットとするより有益なページをユーザーに提供することで、これを少し簡単にすることができます。
private void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
if (ex is HttpAntiForgeryException)
{
Response.Clear();
Server.ClearError(); //make sure you log the exception first
Response.Redirect("/error/antiforgery", true);
}
}
とあなたの/error/antiforgery
ビューはは申し訳ありませんが、あなたが同じ情報を提出しようとしていることを伝えることができます二回もう一つのアイデアは、エラーを記録し、ログイン画面にユーザーを返すことです
:
OnExceptionメソッドをオーバーライドするHandleAntiforgeryTokenErrorAttribute
クラスを作成します。
HandleAntiforgeryTokenErrorAttribute。CS:
public class HandleAntiforgeryTokenErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
filterContext.ExceptionHandled = true;
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary(new { action = "Login", controller = "Account" }));
}
}
グローバルフィルタ:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new HandleAntiforgeryTokenErrorAttribute()
{ ExceptionType = typeof(HttpAntiForgeryException) }
);
}
}
ログインが一般ロギング用アプリケーション
NLogの重要な部分であるとして、私はまた、すべての情報を記録するためにいくつかのツールを使用すると、重要なアプリケーション例外(Web例外を含む)に関する電子メール。
ElmahフィルタリングとWeb例外の電子メール。
編集: また、SafeFormというjQueryプラグインを参照してください。 Link
EDIT:
私はこの上の議論のアロット見ていると、対象のすべての人の意見は(owasp.orgからの引用)されてどのように私はそれを見て、有効なポイントを持っている
4クロスサイトリクエストフォージェリ(CSRF)は、彼らが が現在を認証しているているWebアプリケーション上で不要なアクションを実行するために、エンドユーザー を強制的に攻撃され、CSRF攻撃は、具体的な状態-変るをターゲットgの要求であり、データの盗難ではありません。偽造防止トークンは、「誰がログオンしているか」に特化した です。あなたが戻って、その後、ログインしたらそう、 古いトークンが有効ではなくなりました
ので、もし今、私はまた、ユーザーのIPアドレスを変更した場合に2ファクタ認証と私のアプリケーションで割り当てることのログインを許可するIPアドレスを使用しますクロスサイトリクエスト偽造が試されていた場合、ユーザーはIPアドレスと一致せず、2要素認可を要求します。セキュリティルーターが動作する方法とほとんど同じです。あなたのログインページにそれを残したいのであれば、友人のエラーページを設定しておけば、何か間違っていると見られるように人々は動揺しません。
スクリプトを使用して、ダブル送信を無効にすることができます。http://stackoverflow.com/questions/2830542/prevent-double-submission-of-forms-in-jquery –
こんにちは、私はユーザーが戻るボタンを押すと同じ問題が発生していますブラウザで。あなたは何で終わりましたか? – VAAA
@VAAA: は私の質問のEDITセクションを参照してください - 唯一のログインフォームが最後に、私たちはそこにトークンの検証を無効にして、私たちはこの問題を与えたことから。私たちはそれが単に問題の価値がないと率直に決めて、私は何も "クリーンな"解決策を見つけることができませんでした - ほんの少しの厄介な回避策(私はtry-catchで掲示しました)。 – user2384366