2011-06-22 9 views
1

古いaspxコードのバグを追跡しています。問題は、2人のユーザーが非常にまれな1つ(1/10,000ページビュー程度)のユーザーが混在していることです。ユーザAはユーザBのデータを見る。Aspx、クラスのグローバルインスタンス、コード構造の可能性のあるバグ

loginpageで
Public Module MyGlobals 
    Public myUser As CMyUser 
End Module 

、我々は、ユーザー名/パスワードを検証している場合に有効な、その後coorospondingユーザーID:我々は、このようにモジュールで定義されているユーザークラスを持っている:ここでは

は、コードが構成されている方法ですDBからロードされた、と私たちは何されています

FormsAuthentication.SetAuthCookie(userid, False) 

はその後、我々は安全な場所にリダイレクトします。安全なエリアマスターページでは、イベントPage_Initに、我々はその後、持っている:

If Context.User.Identity.IsAuthenticated then 
    ' Initialize the user class (user data is loaded) 
    MyGlobals.myUser = New CMyUser(Context.User.Identity.Name) 
Else 
    ' Redirect to loginpage 
End If 

以下、持っているすべてのページから

MyGlobals.myUser

インスタンスにアクセスすることが安全ですマスターページとしての安全なマスターページ、またはこの構造に問題がある可能性がありますか?

+0

はグローバルは、すべてのページリクエストの最後でスコープの外に落ち反対しないだろうか? – Emyr

答えて

2

VB.Netモジュールは、プライベートコンストラクタとC#の静的フィールドのみを持つ静的クラスに似ています。

つまり、モジュールで宣言されたすべての変数はすべてのスレッドで共有されます。したがって、このモジュールを使用しているすべてのリクエスト(User)は古い値を上書きします。

セッションを使用してユーザーに重要なデータを保存することを強くお勧めします。 しかし、なぜ私はあなたが上に自分自身を示しているようにFormsAuthenticationを使用して既に格納されているので、ユーザー名を保存したいのか分かりません。

本当にこのラッパーが必要な場合は、簡単HttpContext.Current.Sessionを経由しても、静的コンテキストでそれを達成できる:

Module MyGlobals 
    Public Property myUser As CMyUser 
     Get 
      If HttpContext.Current.Session("CurrentUser") Is Nothing Then 
       Return Nothing 
      Else 
       Return DirectCast(HttpContext.Current.Session("CurrentUser"), CMyUser) 
      End If 
     End Get 
     Set(ByVal value As CMyUser) 
      HttpContext.Current.Session("CurrentUser") = value 
     End Set 
    End Property 
End Module 
+0

これを説明してくれてありがとう、私たちの問題の原因になっている可能性があります... CMyUserクラスは、名前、メール、電話、優先言語などのように、dbからユーザーデータを読み込みます。これをグローバルモジュールに入れて、1つの場所(masterpage)にロードし、MyGlobals.myUser.name_firstまたはMyGlobals.myUser.mailのようにアクセスするだけです。 – Muleskinner

+0

本当に必要な場合は、 'myUser'をプロパティに、' HtppContext.Current.Session'を使ってプロパティを保存することで簡単に達成できます。待って、私は私の答えを編集します。 –

+0

ありがとう、動作するようです。 10.000程度のページロードを除いて、おそらく2人のユーザーが同じ小さな時間間隔でページを読み込んでいることを除いて、それが動作する前に。 myUserをモジュールとしてパブリックとして宣言したことで、私たちが抱えていた問題は説明できますか? – Muleskinner

関連する問題