0
  • 私はMVC 4 Webアプリケーションを持っています。
    • 私のiis7環境にデプロイされました。
    • Windows 認証と偽装を使用します。
    • 会社のポリシーにより、15 分後にセッションがタイムアウトするように設定されています。

これは、asp.net アプリケーションでは常に正常に機能しました。しかし、私は MVC4 アプリケーションを持っているので、global.asax と session_start を使用してセッションがタイムアウトしてリダイレクトされたかどうかを判断する代わりに、セッション期限切れアクション フィルターを設定しました。

ユーザーがアプリケーションをアイドル状態のままにするまで、すべてが期待どおりに機能し、セッションがタイムアウトするとリダイレクトされます。アプリプールのアイドルタイムアウトは 20 分で、ここで問題があると考えられます。

ユーザーが自分のアプリケーションを開いたままにしてよく行う会議に向かい、アイドル タイムアウトに達した場合、ユーザーが戻ってきていつかやろうとすると、アプリケーションがセッション タイムアウトでリダイレクトしようとすると、ループに閉じ込められたエラー ログが記録され、リダイレクトされることはありません。

リダイレクトを試行するには、事後 (つまり、アイドル タイムアウト) では遅すぎますか? 以前は、asp.net アプリケーション (MVC 以外) で、global.asax のセッション開始時に常にこのアクション (つまり、セッション タイムアウトでのリダイレクト) を実行していましたが、うまくいきました。明らかに、このイベントは、アプリケーションのアイドル タイムアウトが発生する前に常に発生していました。

任意の助けをいただければ幸いです。これが私のセッションハンドラーのコードです:

 public class SessionExpireAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// Called by the ASP.NET MVC framework after the action method executes.
        /// </summary>
        /// <param name="filterContext">The filter context.</param>
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
        }

         ///<summary>
         ///Called by the ASP.NET MVC framework before the action method executes.
         ///</summary>
         ///<param name="filterContext">The filter context.</param>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (filterContext.HttpContext.Session != null)
            {
                if (filterContext.HttpContext.Session.IsNewSession)
                {
                    var sessionStateDetails =(SessionStateSection)ConfigurationManager.GetSection("system.web/sessionState");
                    var sessionCookie = filterContext.HttpContext.Request.Headers["Cookie"];
                    if ((sessionCookie != null) && (sessionCookie.IndexOf(sessionStateDetails.CookieName) >= 0))
                    {
                        if (filterContext.HttpContext.Request.IsAjaxRequest())
                        {
                            filterContext.HttpContext.Response.Clear();
                            filterContext.HttpContext.Response.StatusCode = 403;

                        }
                        else
                        {

                            RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
                            redirectTargetDictionary.Add("action", "SessionTimeout");
                            redirectTargetDictionary.Add("controller", "Home");

                            filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);

                        }
4

1 に答える 1

0

誰かが同様の問題を抱えている場合に備えて、 Githubで見つけることができるphilpalmieri のjquery プラグインを使用して、最終的にこれを解決しました。

20 分のアイドル タイムアウトに設定し、この方法で呼び出すと、アプリがアイドル状態になる前に常にセッション タイムアウトにリダイレクトされるため、無限ループは発生しません。

function logout() {
    ////session redirect goes here 
    var pathArray = window.location.pathname.split('/');
    var segment_1 = pathArray[1];
    window.location =  window.location.protocol + "//" + window.location.host + "/" + segment_1 + "/Home/SessionTimeout";
}

$(document).ready(function () {
    var SEC = 1000;
    var MIN = 60 * SEC;
        $(document).idleTimeout({
            inactivity: 20 * MIN,
            noconfirm: 2 * SEC,
            redirect_url: 'javascript:logout()',
            click_reset: true,
            alive_url: '',
            logout_url: ''
        });
});

誰かがより良い解決策を持っているなら、私はそれを聞きたいです...

于 2013-09-09T09:37:48.083 に答える