2012-03-25 6 views
2

私は、ポータルにアクセスするためにユーザーの認証が必要なASP.Netアプリケーション(イントラネット)を開発しています。ASP.Netセッションにおけるオブジェクトの永続化

現在、従業員オブジェクトは、正常に認証されたInProcセッション状態に保存されます。次に、マスターページのPageLoadメソッドで、従業員のセッションが空(null)であることを確認します。つまり、現在のリクエストが認証されていないことを確認してから、ログインページにリダイレクトしました。

マスターページPageLoad:私も従業員にログインまたは権限などの彼のレベルに関するいくつかの詳細を取得するために、ほぼすべてのページに従業員のセッションを使用し

if (Session["Employee"] == null) Response.Redirect("~/Login.aspx"); 

..

マイ質問:

  1. このようなシナリオを処理するのに適していますか?
  2. セッション状態がサーバーでリサイクルされることがあります(紛失)ので、PageLoadのセッション状態をのchlidページに呼び出した場合、セッションはnullですが、マスターページのonLoadメソッドセッションの存在のためには、子ページonLoadメソッドの後にのみ実行されます。統一された場所でどのようにセッションの存在を確認できますか?セッションの状態にアクセスするたびに、セッションの存在をチェックしたくないからです。
  3. セッションが終了したらメソッドをトリガーすることはできますか?私はGlobal.asaxでSession_Endを試みましたが、それは私に何らかのメソッドを呼び出したりページにリダイレクトすることを許しません。

答えて

3
  • 上記の技術は、このようなシナリオを処理するために良いです、ありがとう!

「良い」はもちろん主観的です。しかし、このシナリオはうまくいくはずです。ユーザーの追跡を処理する方法は複数ありますが、誰かが具体的な提案をしているのか不思議です。

  • セッションの存在をどこでどのように確認できますか?

ユーザ追跡のセッション部分をアプリケーション内の共通オブジェクトに抽象化することをお勧めします。そのオブジェクト内では、Sessionがnullかどうかをチェックし、ユーザーがログインしているかどうかをチェックし、それに応じて応答します。すべてのページ(子とマスター)はそのオブジェクトを使用するだけです。

これは利点のカップルを提示:

  1. は1つのだけの場所でセッション・ロジックを記述する必要があります。だから、あなたは常にの書き込み条件をアプリケーション全体に書いているわけではありません。残りのアプリケーションは、共通オブジェクトのメソッドを呼び出すだけです。後で何か他にセッションから追跡し、ユーザーに移動したい場合は
  2. あなたは、(例えばデータベースを、...私は良い結果と過去の過渡Webアプリケーションのデータを追跡するためにRavenDBとM​​ongoDBのようなものを使用しました) 1つのクラスを変更するだけです。残りのアプリケーションは、引き続きその共通オブジェクトを使用し続けます。
    public static string GetCurrentUsername() 
    { 
        if (Session["Employee"] == null) 
         throw new SomeKindOfAuthenticationException(); 
        return ((EmployeeObject)Session["Employee"]).Username; 
    } 
    

    は、その後、あなたのアプリケーション全体であなただけのGetCurrentUsernameにユーザ追跡オブジェクトを呼びたい:

は例えば、クラスはこのようなものを持つことができます。 Application_Errorでは、ログインページにリダイレクトすることで認証例外を処理します。 (これは、一般的に認証されていないユーザーのために、上記の方法では空の文字列を返す、と言う、より良い習慣であると考えられている。空の文字列は、アプリケーション全体常にをチェックしなければならないであろう、例外処理が単一で起こることができるのに対し、場所。あなたは、この場合には、ログインページにリダイレクトするのではなく、単に、何かを表示し、そのページへの局所的な例外処理で呼び出しをラップし、それに応じてそれを処理できないに特定のページをいないが必要な場合。)

を考えてみましょう、のもちろん、これは主に高水準の設計の推測であり、私は私の目の前に実際の実装を指しているわけではありません。おそらくstaticになるとSessionに問題が発生しますか?おそらくそれをSessionに渡す必要がありますか?このクラスはどこに保管すべきですか?あなたは他のエラーチェックをしてください。等々。

  • セッションが終了したらメソッドをトリガすることはできますか?

確かに、私の経験では。セッションが終了する可能性のあるすべての方法を考慮してください。ユーザーは、セッションをクリアするロジックを持つ「ログアウト」リンクをクリックすることも、ブラウザを放棄することも、接続が長期間失敗することもあります。Webアプリケーションは受動的な要求/応答システムです。ユーザーの介入なしにセッションタイムアウトに応答することは、現在進行中のサーバー側のプロセスと同じですが、Webアプリケーションはそれには適していません。

これは実際に私は、データベース内のこの一時データを格納して実験してきた理由の一つです。そうすれば、私はそのデータベースを監視し、それに応じて、物事への応答(例えばWindowsのサービスとして... は、ユーザーの要求なしに、バックグラウンドで常に実行するように設計された何か)別のプロセスを持つことができます。このような設定で実行できることの1つは、一種の手動Session_Endです。別のプロセスは、(例えば、アクティビティ追跡レコードのタイムスタンプをチェックすることによって)X分で活動を見なかったセッションについてデータベースをポーリングし、関連するデータをクリアして他のタスクを実行することによって応答する。私の意見で

これはかなりきれいに(サーバー側のデータを維持する)追跡ウェブアプリケーション(ユーザーの要求に応答)と国家の責任を分離します。

+0

詳細な回答のためにDavidさん、ありがとうございました。私のコードを変更しました。サンプルコードのような静的なクラスを作成しましたが、例外は何ですか?現在、私はApplicationExceptionを特定のメッセージ "Session Not Found"で使用し、次にApplication_Errorメソッドで内部例外のメッセージがそのメッセージと等しいかどうかをチェックし、それに応じて応答します。そして、EmployeeクラスはApp_Codeではなく別のプロジェクトにあることに注意してください。例外を処理する際に何か違いがあるかどうかはわかりません。 –

+0

@OsamaMortada:あなたは 'ApplicationException'を投げることができます。たぶん 'SecurityException'ですか?この場合、カスタム例外を作成してそれをスローすることもできます。 'NotLoggedInException'のようなものです。カスタム例外の大きな点は、独自のフィールドを定義することができることです。その例外タイプをチェックする 'Application_Error'では、それらのカスタムフィールドから簡単にデータを取得できます。 – David

+0

Davidさん、ありがとうございました。私は、ApplicationExceptionが常にHttpException内にスローされ、内部の例外から取得しなければならないことに気づいたので、SecurityExceptionが優れていると思います!!アプリケーション例外がHttpException内で常に歪んでいる理由はわかりません。ありがとうございますDavid: –

0

は、上記の技術は、このようなシナリオを処理するためには良いですか?

どのように、どこで、私は統一の場所でセッション存在するかどうかを確認することができますか?

あなたは、あなたのすべてのaspxページでBasePageクラスを継承することができますASP.net "BasePage" class ideas


あなたのために、この議論が参考になる基本ページ にセッション関連のロジックを追加することができます。以下は、私も

public String FirstName 
    { 
     get 
     { 
      if (UserName == null) 
       return String.Empty; 
      return Convert.ToString(HttpContext.Current.Session["FirstName"]); 
     } 
    } 
} 
...従業員のログインや権限の彼のレベルなどに関するいくつかの 詳細を取得するために、ほぼすべてのページに従業員のセッションを使用するサンプル例

public class BaseClass : System.Web.UI.Page 
{ 
    public String UserName 
    { 
     get 
     { 
      if (HttpContext.Current.Session["UserName"] == null) 
       Response.Redirect("Login.aspx"); 
      return Convert.ToString(HttpContext.Current.Session["UserName"]); 
     } 
    } 

です


+0

あなたの答えをありがとう、私は基本クラスの詳細を読むだろうと私はそれが役に立つと思います。 –

関連する問題