Перенаправление нажатия ASP.NET на тайм-ауте сессии

Преобразуйте свои даты в часовой пояс GMT, когда вы набиваете их в Mongo. Таким образом, никогда не возникает проблема с часовым поясом. Затем просто сделайте математику в поле twitter / timezone, когда вы вытащите данные для презентации.

23
задан Michael 27 January 2009 в 19:56
поделиться

6 ответов

Обычно, Вы устанавливаете тайм-аут сессии, и можно дополнительно добавить верхний колонтитул страницы для автоматического перенаправления текущей страницы к странице, где Вы очищаете сессию прямо перед тайм-аутом сессии.

От http://aspalliance.com/1621_Implementing_a_Session_Timeout_Page_in_ASPNET.2

namespace SessionExpirePage
{
    public partial class Secure : System.Web.UI.MasterPage
    {
        public int SessionLengthMinutes
        {
            get { return Session.Timeout; }
        }
        public string SessionExpireDestinationUrl
        {
            get { return "/SessionExpired.aspx"; }
        }
        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            this.PageHead.Controls.Add(new LiteralControl(
                String.Format("<meta http-equiv='refresh' content='{0};url={1}'>", 
                SessionLengthMinutes*60, SessionExpireDestinationUrl)));
        }
    }
}

SessionExpireDestinationUrl должен связаться со страницей, где Вы очищаете сессию и любые другие пользовательские данные.

, Когда заголовок обновления истечет, он автоматически перенаправит их к той странице.

27
ответ дан TJB 29 November 2019 в 01:27
поделиться

Вы не можете действительно "продвинуть" клиент со своего веб-сайта. Ваш сайт ответит на запросы от клиента, но это - действительно он.

то, Что это означает, - то, что необходимо записать что-то клиентское (JavaScript), который определит, когда пользователь испытал таймаут, вероятно, путем сравнения текущего времени с новым временем они имеют в cookie сайта (который Вы обновляете с текущим временем каждый раз, когда пользователь посещает страницу на Вашем сайте), и затем перенаправьте, если различие больше, чем определенная сумма.

(я отмечаю, что некоторые люди рекомендуют просто создавать сценарий, который передаст пользователю после определенного количества времени на странице. Это будет работать в простом случае, но если пользователь будет иметь два окна, открытые на сайте, и будет использовать одно окно много и другое окно не так, то не так каждый внезапно перенаправит пользователя к передающей странице, даже при том, что пользователь постоянно был на сайте. Кроме того, это не находится действительно в синхронизации ни с каким хранением сессии, которое Вы делаете на стороне сервера. С другой стороны, конечно, легче кодировать, и если это является достаточно хорошим, затем большим!)

10
ответ дан Beska 29 November 2019 в 01:27
поделиться

Я использую MVC3 ASp.net в качестве новичка, я пробовал много решений, чтобы решить мою проблему сеанса (так как я использую переменную Session в своем коде, и после тайм-аута у меня не было значений сеанса, пока я держу используя его, и я просто обнаружил, что моя проблема была в файле конфигурации. Тайм-аут между Аутентификацией и sessionState должен быть настолько близок, чтобы они убили (пусто) одновременно // добавили тайм-аут 1 и 2 для тестирования .. он должен быть в минимум 29 и 30

Я использовал другие, как это работает тоже:

Начиная с:

    protected void Session_Start(object src, EventArgs e)
    {
        if (Context.Session != null)
        {
            if (Context.Session.IsNewSession)//|| Context.Session.Count==0)
            {
                string sCookieHeader = Request.Headers["Cookie"];
                if ((null != sCookieHeader) && (sCookieHeader.IndexOf("ASP.NET_SessionId") >= 0))
                {
                    //if (Request.IsAuthenticated)
                     FormsAuthentication.SignOut();
                     Response.Redirect("/Account/LogOn");
                }
            }
        }

    }

    protected void Session_End(object sender, EventArgs e)
    {
     //Code that runs when a session ends. 
     //Note: The Session_End event is raised only when the sessionstate mode 
     //is set to InProc in the Web.config file. If session mode is set to StateServer
      //or SQLServer, the event is not raised. 
        Session.Clear();          
    }

И:

public class SessionExpireFilterAttribute : ActionFilterAttribute
{

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpContext ctx = HttpContext.Current;

        // check if session is supported
        if (ctx.Session != null)
        {

            // check if a new session id was generated
            if (ctx.Session.IsNewSession)
            {
                // If it says it is a new session, but an existing cookie exists, then it must
                // have timed out
                string sessionCookie = ctx.Request.Headers["Cookie"];
                if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0))
                {
                    ctx.Response.Redirect("~/Home/LogOn");
                }
            }
        }

        base.OnActionExecuting(filterContext);
    }
}

И даже работал с Ajax для решения проблемы сессия:

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (Session.Count == 0 || Session["CouncilID"] == null)
            Response.Redirect("/Account/LogOn");

        if (Request.IsAjaxRequest() && (!Request.IsAuthenticated || User == null))
        {
            filterContext.RequestContext.HttpContext.Response.StatusCode = 401;
        }
        else
        {
            base.OnActionExecuting(filterContext);
        }
    }

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public class AuthorizeUserAttribute : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (!httpContext.Request.IsAjaxRequest())
            {//validate http request.
                if (!httpContext.Request.IsAuthenticated
                    || httpContext.Session["User"] == null)
                {
                    FormsAuthentication.SignOut();
                    httpContext.Response.Redirect("~/?returnurl=" + httpContext.Request.Url.ToString());
                    return false;
                }
            }
            return true;
        }

        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                filterContext.Result = new JsonResult
                {
                    Data = new
                    {
                        // put whatever data you want which will be sent
                        // to the client
                        message = "sorry, but you were logged out"
                    },
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
            }
            else
            {
                base.HandleUnauthorizedRequest(filterContext);
            }
        }

    }
2
ответ дан Rasha 29 November 2019 в 01:27
поделиться

В разделе < HEAD> используйте тег обновления META следующим образом:

<meta http-equiv="refresh" content="0000; URL=target_page.html">

где 0000 - время ожидания сеанса в секундах, а target_page.html - адрес страницы, на которую следует перенаправить .

6
ответ дан devio 29 November 2019 в 01:27
поделиться

К сожалению, это не может быть сделано. Тайм-аут сеанса происходит только на стороне сервера, и вы не обнаружите его, пока пользователь не выполнит какое-либо действие обратной отправки.

Тем не менее, вы МОЖЕТЕ ввести код заголовка HTML или JavaScript, который автоматически подтолкнет пользователя на страницу выхода из системы в тот же период времени, что и время сеанса. Это не гарантирует идеальную синхронизацию, и вы можете столкнуться с проблемами, если ваш пользователь выполняет какие-то трудоемкие задачи, а вы не сбрасываете часы.

Я обычно добавляю этот код в свои события Page_Load, чтобы выполнить это.

' Register Javascript timeout event to redirect to the login page after inactivity
  Page.ClientScript.RegisterStartupScript(Me.GetType, "TimeoutScript", _
                                              "setTimeout(""top.location.href = 'Login.aspx'""," & _
                                               ConfigurationManager.AppSettings("SessionTimeoutMilliseconds") & ");", True)
1
ответ дан Dillie-O 29 November 2019 в 01:27
поделиться

Конечно, вам нужно использовать [Authorize] поверх класса контроллера или даже действие в конкретном.

[Authorize]
public class MailController : Controller
{
}
1
ответ дан Sergey Glotov 29 November 2019 в 01:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: