10

C#MVCアプリケーションを開発していますが、認証とセッションのタイムアウトを同期させることができないようです。基本的なフォーム認証の設定といくつかの制限されたセッション値があります。認証タイムアウトをセッションよりも短く設定しましたが(28分対30)、開発Webサーバーに対して実行すると、サーバーの再起動時にセッションがワイプされますが、認証は保持されます。私は、認証が明らかにサーバーの再起動後も存続するCookieに保存されていると想定しています。

<authentication mode="Forms" >
  <forms loginUrl="~/Account/Login" timeout="28" />
</authentication>
<sessionState timeout="30" />

セッションがnullの場合、認証を強制的にタイムアウトさせてから、ログインを強制したいと思います。

それは私が実際にやりたいことですか?もしそうなら、どのようにそしてどこでこれを行うのですか?

そうでない場合、これを処理する適切な方法は何ですか?

編集

より多くの観点から、私はこの同じプロジェクトについてこの質問も投稿しました:ログイン...ベストプラクティス?

4

2 に答える 2

14

私は自分の答えを見つけました。Authorize属性をオーバーライドします。これは最もエレガントなアプローチのようです。

public class AuthorizeWithSessionAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (httpContext.Session == null || httpContext.Session["CurrentUser"] == null)
            return false;

        return base.AuthorizeCore(httpContext);
    }

}
于 2012-11-12T17:27:21.740 に答える
6

これは、preRequestHandlerExecuteイベントハンドラーを使用してglobal.asaxで処理できます。

protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        //Check if user is authenticated
        HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
        if (authCookie != null)
        {
            FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            if (!authTicket.Expired)
            {
                if (Session["XYZ"] == null)
                {
                    //Session is null, redirect to login page
                    FormsAuthentication.SignOut();
                    Response.Redirect(FormsAuthentication.LoginUrl, true);
                    return;
                }
            }
        }
    }

または、Httpmoduleを記述して実装context_AuthenticateRequestし、セッションが存在するかどうかを確認し、それに応じてリクエストを処理することもできます。

お役に立てば幸いです。

Valamasによる編集

セッションエラーのヘルプについては、回答https://stackoverflow.com/a/1446575/511438を参照してください。

于 2012-09-05T04:28:21.023 に答える