3

ここで説明するように、偽造防止フレームワークを実装しています。

http://weblogs.asp.net/srkirkland/archive/2010/04/14/guarding-against-csrf-attacks-in-asp-net-mvc2.aspx

さらに、コーディングの労力を最小限に抑えるために、form.onsumitイベントとajaxsendイベントを処理するクライアント側でトークン挿入部分を実行しました。セッションが期限切れになるまで、すべてが正常に機能します。

私のアプリケーションでは、ユーザーセッションがタイムアウトしたときにポップアップを表示します。このポップアップでは、ユーザーは現在のページを更新せずに再ログインして続行できるため、進行中の作業を安全に行うことができます。しかし、これはアンチCSRFロジックとはうまくいきません。タイムアウトしたセッションの後にユーザーが再ログインしようとすると、Cookie(__RequestVerificationToken_Lw__)の有効期限が切れており、次のページが更新されるまで今後のPOSTはすべて無効になるため、CSRF例外がスローされます。

Cookieの終了時刻を「セッション」ではなく将来の日付に設定する方法はありますか?Response.Cookieを編集しようとしましたが、Cookieが無効になりました。

どんな助けでもいただければ幸いです。ありがとう

4

1 に答える 1

1

ユーザー セッション アウト時 (ポップアップ表示時) に、サーバー側で有効期限付きの httpcookie を設定することができます。

Microsoft の偽造防止トークンの実装からいくつかのコードを抽出しました。

internal static string GetAntiForgeryTokenName(string appPath)
        {
            if (string.IsNullOrEmpty(appPath))
            {
                return "__RequestVerificationToken";
            }
            return "__RequestVerificationToken_" + Base64EncodeForCookieName(appPath);
        }

    private static string Base64EncodeForCookieName(string s)
    {
        byte[] bytes = Encoding.UTF8.GetBytes(s);
        string text = Convert.ToBase64String(bytes);
        return text.Replace('+', '.').Replace('/', '-').Replace('=', '_');
    }

サーバー側でクッキーを設定する以下のコード。

string antiForgeryTokenName = GetAntiForgeryTokenName(HttpContext.Request.ApplicationPath);
            HttpCookie httpCookie = HttpContext.Request.Cookies[antiForgeryTokenName];

            HttpCookie httpCookie2 = new HttpCookie(antiForgeryTokenName, httpCookie.Value)
            {
                HttpOnly = true
                //// your domain Domain = , 
                //// path Path = , 
                //// set path Expires = 
            };

            HttpContext.Response.Cookies.Set(httpCookie2);

このコードはまだテストしていないことに注意してください。他に選択肢がない場合は試してみてください。

于 2012-10-05T06:25:39.630 に答える