1

これはやや一般的な問題であることはわかっていますが、まだ解決策を見つけていないので、すべてのヘルプやコメントを本当に感謝しています.

IHttpModule 実装では、Init メソッドで次のようにハンドラーをセットアップしました。

public void Init(HttpApplication context)
{
  context.PreRequestHandlerExecute += new EventHandler(PreRequestHandlerExecute);
}

PreRequestHandlerExecute メソッドでは、すべての AJAX 呼び出しに対して、「このコンテキストではセッション状態を利用できません」という例外が発生します。

public void PostRequestHandlerExecute(Object application, EventArgs e)
    {
        HttpApplication app = application as HttpApplication;
        var a = app.Session["csrf_token"];

または、これを行うと NullReferenceException が発生します

var b = HttpContext.Current.Session["csrf_token"];

セッション内のオブジェクトにアクセスしようとしています。オブジェクトはそこに置かれ、非 ajax 呼び出し中に問題なく読み取られます。

質問は具体的には次のとおりです。セッションではなくオブジェクトを保存できる、または保存する必要がある代替の場所はありますか (DB または Cookie 以外)?

- または -

いくつかの設定または何かを介して、AJAX リクエスト中にセッションを利用可能にする方法はありますか?

- または -

一般的に.Netですべきではないことをしているだけですか。私はネイティブの Java 担当者です。.Net の概念は私にとって初めてのことです。

(それが役立つ場合は、aspx MVP アプリケーションで CSRF を防ぐために「シンクロナイザー トークン パターン」を実装しようとしています)

どうもありがとうジョン

4

1 に答える 1

0

実際、CSRF 保護を目的とした別の解決策は、Session の代わりに Runtime.cache を使用することです。キャッシュキーには、ユーザーを一意に識別する ID (ユーザー名など) を組み込むことができます。キャッシュのタイムアウトは、セッションの有効期限が切れる前にタイムアウトするのを避けるために、おそらくセッションまたは認証のタイムアウト時間を超える必要があります。アクセスするとキャッシュの有効期限が更新されるように、キャッシュを適用する必要があります。つまり、絶対的な有効期限ではなく、スライド式の有効期限です。http://msdn.microsoft.com/en-us/library/system.web.caching.cache.add(v=vs.110).aspx

if( HttpRuntime.Cache.Get("dummy") == null )
{
    HttpRuntime.Cache.Add("dummy", "==Username + CSRF TOKEN", null,
                        DateTime.Now.Add(TimeSpan.FromMinutes(30)),                 Cache.NoSlidingExpiration,
                                 CacheItemPriority.Normal,
                                 null);
 } else
 {
     var a = HttpRuntime.Cache.Get("dummy");
     Debug.WriteLine(a);
 }

Runtime.Cache は常に利用可能です。そうすれば、ajax または非 ajax リクエストで受信した CSRF トークンを、セッション値ではなくキャッシュ値と比較できます。

于 2014-02-21T11:54:28.480 に答える