2011-01-05 5 views
3

私は、MVC2のデフォルトプロジェクトのメンバーであるMembershipProviderを使用しています。現在のユーザーではない複数のメンバーシップユーザーをログオフする方法はありますか?

私はユーザー名のリストを取得し、ユーザーをログオフし、必要に応じてセッションを破棄したいと考えています。私は私がログアウトするユーザを関連セッションおよび/またはサインアウトメソッドを使用する必要があると思う

foreach(string userName in UserNames) 
{ 
    MembershipProvider MembershipProvider = new MembershipProvider(); 
    MembershipUser membershipUser = MembershipProvider.GetUser(userName, true); 
    Session.Abandon(); 
    FormsAuthentication.SignOut(); 
} 

が、私はそれらのようになりどこか不明だ:私は来ているように見えることができます最も近いがこれです。

これを行う適切な方法は何ですか?

+0

それは動作しません...セッション。Abandon()は、現在のHttpContext用です。各ユーザーのためではありません。 – turtlepick

答えて

0

これはのMembershipProviderに、しかしFormsServiceにはあまり関係していないことが判明しました。私の最終的な解決策は、ここに掲示された2つの他の答えのハイブリッドの一種であることが判明しました。

私は自分のFormsAuthenticationTicketをアカウントコントローラーでLogOnアクションで作成しました。ユーザーの認証済みセッションの一意の識別子を生成し、その識別子をデータベースに保存します。また、信頼できる検索のために、ユーザーのIDをauthチケットのUserData部分に追加しました。デフォルトでは、認証チケットにはユーザー名のみが含まれていました。 FormsAuthenticationTicketは、ユーザーのログオンに成功するとCookieに格納されます。

基本的にはすべてがFormsService.SignIn(model.UserName、model.RememberMe)に置き換えられました。

また、Global.asaxのpublic void Application_ReleaseRequestState(オブジェクト送信者、EventArgs引数)も追加しました。これをオーバーライドするようには見えないので、関数を拡張すると考えられているのかどうかは分かりません。 Application_ReleaseRequestStateの内部では、ユーザーのFormsAuthenticationTicketをCookieから取得します。次に、authチケットを復号化し、チケットのUserData部分からユーザーのUserIDを取得します。次に、認証チケットがまだ有効かどうかをデータベースに尋ねます。チケットが有効でない場合、ユーザーのCookieが期限切れになるように設定されます。

強制的にユーザーをログオフするには、データベース内の認証チケットの有効期限を変更するか、データベース内の認証チケットの無効ビットを切り替えることができます。いずれの場合でも、Application_ReleaseRequestStateは、認証チケットが有効かどうかをデータベースに問い合わせると、認証されません。したがって、これらのクッキーは、このチェックが行われた後にユーザーがヒットする次のページで期限切れになるように設定されます。

1

私はこれを行ったときにメンバーシッププロバイダを使用しませんでしたが、ユーザーがログオンしたときにSessionId、UsernameおよびlastPageをデータベースに保存しました。各ページは現在のセッションIDを使用してユーザー名を取得し、現在のユーザーの表示バランスなど、関連するユーザー名の処理を行いました。セッションに有効なユーザーがいない場合はログオンページに戻ります。

これにより、ユーザーはWebサイトを介して進行し、私が望むものを手動で切断し、ユーザーごとにシングルサインオンを与えることができました。現在のHttpContextのためになりglobal.asxページは動作しません

+0

私はこれを行う方法を理解していますが、私は本当にMembershipProviderを使ってそれを行う方法を知りたいと思います。提案していただきありがとうございます。 – Sgraffite

2

でクリーンアップコードの束...

Session.Abandonは()もありました。あなたがやろうとしているように、各ユーザーのためではありません。 FormsAuthentication.SignOut()と同じです。

あなたの最善の策は、のApplication_AuthenticateRequestイベントでその配列に対する現在のユーザーを確認し、そこにサインアウトです:

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
    { 
      if (User.Identity.IsAuthenticated) 
      { 
       //add your ckeck here 

       if (Usernames.Contains(User.Identity.Name)) 
        { 
         Session.Abandon(); 
         FormsAuthentication.SignOut(); 
        } 
      }  
    } 
+0

名前をハードコードしたときにユーザーをログアウトさせることができましたが、これを置くのが奇妙な場所だとは思えません。私はそこにログアウトしたいユーザ名を読み込むための方法が必要です。これはおそらく、そのメソッドが呼び出されるたびにデータベース呼び出しを意味します。 – Sgraffite

+0

私はそれが後ろ向きに感じると思います。その場合、ユーザーが強制的にログアウトする前にウェブサイトを再度訪れるのを待っているからです。彼らのクッキーが無関係になるようにセッションサーバ側を無効にする方法があるはずです。 – Sgraffite

+0

すべてのリクエストはHttpContextを介して実行され、処理するモジュールの1つは「SessionModule」です。その時点で、このリクエスタのセッションだけを読むことができます。 「どのくらい開いているセッション数」をカウントしても、カスタムロジックが必要で、セッションイベントを監視します。 – turtlepick

関連する問題