0

Forms Auth を使用しているサイトがあります。クライアントは、ユーザーのサイト セッションが期限切れになることをまったく望んでいません。ログイン ページのコード ビハインドでは、次のコードが使用されます。

// user passed validation
FormsAuthentication.Initialize();

// grab the user's roles out of the database 
String strRole = AssignRoles(UserName.Text);

// creates forms auth ticket with expiration date of 100 years from now and make it persistent
FormsAuthenticationTicket fat = new FormsAuthenticationTicket(1,
  UserName.Text, DateTime.Now,
  DateTime.Now.AddYears(100), true, strRole,
  FormsAuthentication.FormsCookiePath);

// create a cookie and throw the ticket in there, set expiration date to 100 years from now
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, 
  FormsAuthentication.Encrypt(fat)) { Expires = DateTime.Now.AddYears(100) };

// add the cookie to the response queue
Response.Cookies.Add(cookie);

Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName.Text, false));

web.config ファイルの認証セクションは次のようになります。

<authentication mode="Forms">
      <forms name="APLOnlineCompliance" loginUrl="~/Login.aspx" defaultUrl="~/Course/CourseViewer.aspx" />
</authentication>

サイトにログインすると、Cookie が正しくブラウザに送信されて戻ってくることがわかります。

HttpFox 出力 http://cid-e79f8e4b07c3e30f.office.live.com/embedphoto.aspx/Public/SessionProblem.png

しかし、20 分ほど離れてからサイトに戻って何かをしようとすると、ログイン ウィンドウが再び表示されます。このソリューションは、当社のサーバーでしばらく機能していましたが、現在は機能しています。VS2008 で Cassini を実行しているローカルの開発ボックスでは問題は発生しません。

これを修正する方法についてのアイデアはありますか?

4

5 に答える 5

2

セッション タイムアウトとフォーム認証タイムアウトは、2 つの別個のものです。セッション タイムアウトが 20 分に設定されている場合、Global.asax ファイルの Session_End イベントでユーザーがログアウトされる可能性はありますか?

于 2010-06-11T20:23:50.553 に答える
1

既定では、IIS 6 のアプリ プールは、20 分間非アクティブになるとシャットダウンするように設定されています。アプリの構成に、アプリがすぐにシャットダウンする原因となるものが何もない場合は、IIS マネージャーでアプリ プールの構成を確認してください。そこに設定できる素晴らしいノブがたくさんあります。

于 2010-08-19T14:45:20.593 に答える
0

もう 1 つ簡単に確認できることは、ホスティングの種類です。クラウド ホスティングには通常、同じ IP をノード サーバーに向けた状態で 20 分程度維持するようにハード セットされたロード バランサーがありますが、この時間が経過すると、新しいサーバーにプッシュされ、新しいサーバー上で新しいセッションが作成され、「ログに記録されます」アウト'

ただし、標準の共有ホスティングまたは単一の専用サーバーまたは仮想サーバーを使用している場合、これは問題になりません:)

これを回避してasp.netセッションを機能させ続けるには、セッション状態をデータベースに移動するか、セッションをまったく使用しないようにコードを再構築する必要があります:)

于 2011-07-25T05:25:56.007 に答える
0

ロード バランサーを使用しているかどうかを確認することをお勧めします。もしそうなら、実際に InProc を保存するべきではありません。複数のエンティティがある場合は、状態サーバーまたは SQL サーバーを調べる必要があります。

この問題に基づいて、デフォルトの 30 分も守られていないようです。これは通常、IIS/ホスティング/ネットワーク構成を指しています。

于 2011-11-13T15:21:45.767 に答える
0

さて、Global.asaxには次のものがあります。

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
        //Fires upon attempting to authenticate the use
        if (!(HttpContext.Current.User == null))
        {
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                if (HttpContext.Current.User.Identity.GetType() == typeof(FormsIdentity))
                {
                    FormsIdentity fi = (FormsIdentity) HttpContext.Current.User.Identity;
                    FormsAuthenticationTicket fat = fi.Ticket;

                    String[] astrRoles = fat.UserData.Split('|');
                    HttpContext.Current.User = new GenericPrincipal(fi, astrRoles);
                }
            }
        }
    }

それはあなたが言及しているものですか?また、違いがある場合は、IIS6 環境にいます。

于 2010-06-11T20:29:16.470 に答える