wake-up-neo.com

ASP.NET Push-Umleitung bei Sitzungszeitüberschreitung

Ich bin auf der Suche nach einem Tutorial, einem Blogeintrag oder einer Hilfestellung zur Technik hinter Websites, die Benutzer automatisch (dh ohne Postback) pushen, wenn die Sitzung abläuft. Jede Hilfe wird geschätzt

23
Michael

Normalerweise legen Sie das Sitzungszeitlimit fest und Sie können zusätzlich einen Seitenkopf hinzufügen, um die aktuelle Seite automatisch auf eine Seite umzuleiten, auf der Sie die Sitzung kurz vor dem Sitzungszeitlimit löschen.

Von 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)));
        }
    }
}

Die SessionExpireDestinationUrl sollte auf eine Seite verweisen, auf der Sie die Sitzung und andere Benutzerdaten löschen.

Wenn der Aktualisierungsheader abläuft, wird er automatisch auf diese Seite umgeleitet.

27
TJB

Sie können einen Client nicht wirklich von Ihrer Website aus "pushen". Ihre Site wird auf Anfragen des Kunden reagieren, aber das ist es wirklich. 

Dies bedeutet, dass Sie etwas clientseitiges (Javascript) schreiben müssen, das festlegt, wann der Benutzer das Zeitlimit überschritten hat. Möglicherweise wird die aktuelle Zeit mit der letzten Zeit in einem Site-Cookie (das Sie mit dem aktuellen aktualisieren) verglichen jedes Mal, wenn der Benutzer eine Seite auf Ihrer Website besucht), und leiten Sie dann um, wenn die Differenz einen bestimmten Betrag überschreitet. 

(Ich stelle fest, dass einige Leute sich dafür einsetzen, ein Skript zu erstellen, das den Benutzer nach einer bestimmten Zeit auf einer Seite weiterleitet. Dies funktioniert im einfachen Fall, wenn der Benutzer jedoch zwei Fenster auf der Website geöffnet hat und verwendet Ein Fenster viel, und das andere Fenster nicht so sehr, das nicht-so-viele wird den Benutzer plötzlich auf die Weiterleitungsseite umleiten, obwohl der Benutzer ständig auf der Website war. Außerdem ist es nicht wirklich synchron Mit jeder Session, die Sie auf der Serverseite machen, ist es sicherlich einfacher zu programmieren, und wenn das gut genug ist, dann toll!)

10
Beska

Verwenden Sie im Abschnitt <HEAD> ein META-Aktualisierungs-Tag wie folgt:

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

dabei ist 0000 das Sitzungszeitlimit in Sekunden und target_page.html die Adresse der Seite, auf die umgeleitet werden soll.

6
devio

Mit der benutzerdefinierten Klasse und Javascript können wir dies auch erreichen.

Erstellen Sie eine benutzerdefinierte pagebase-Klasse, und schreiben Sie die allgemeinen Funktionscodes in diese Klasse. Durch diese Klasse können wir die gemeinsamen Funktionen auf andere Webseiten übertragen. In dieser Klasse müssen wir die Klasse System.Web.UI.Page erben. Fügen Sie den folgenden Code in die Pagebase-Klasse ein

PageBase.cs

namespace AutoRedirect
{
    public class PageBase : System.Web.UI.Page
    {
        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            AutoRedirect();
        }

        public void AutoRedirect()
        {
            int int_MilliSecondsTimeOut = (this.Session.Timeout * 60000);
            string str_Script = @"
               <script type='text/javascript'> 
                   intervalset = window.setInterval('Redirect()'," +
                       int_MilliSecondsTimeOut.ToString() + @");
                   function Redirect()
                   {
                       window.location.href='/login.aspx'; 
                   }
               </script>";

           ClientScript.RegisterClientScriptBlock(this.GetType(), "Redirect", str_Script);
        }
    }
}

Über der Funktion AutoRedirect wird die Anmeldeseite nach Ablauf der Sitzung mit javascript window.setInterval umgeleitet. Dieses window.setInterval führt eine Javascript-Funktion wiederholt mit einer bestimmten Zeitverzögerung aus. Hier konfigurieren wir die Zeitverzögerung als Sitzungszeitüberschreitungswert. Sobald die Ablaufzeit der Sitzung erreicht ist, führt sie automatisch die Umleitungsfunktion und die Steuerübertragung zur Anmeldeseite aus.

OriginalPage.aspx.cs

namespace appStore
{
    public partial class OriginalPage: Basepage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }     
    }
}

OriginalPage.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="OriginalPage.aspx.cs" Inherits="AutoRedirect.OriginalPage" %>

Web.config

<system.web>    
    <sessionState mode="InProc" timeout="3"></sessionState>
</system.web>

Hinweis: Der Vorteil der Verwendung von Javascript besteht darin, dass Sie vor location.href eine benutzerdefinierte Meldung in einer Warnmeldung anzeigen können. Dies ist für den Benutzer absolut sinnvoll. Wenn Sie kein Javascript verwenden möchten, können Sie die Meta-Umleitung wählen ebenfalls

public void AutoRedirect()
{
    this.Header.Controls.Add(new LiteralControl(
        String.Format("<meta http-equiv='refresh' content='{0};url={1}'>",
            this.Session.Timeout * 60, "login.aspx")));
}
3
Durai Amuthan.H

Kopieren Sie einfach dieses Code-Snippet in Ihre Web.Config-Datei:

<authentication mode="Forms">
  <forms loginUrl="~/Login.aspx" slidingExpiration="true" timeout="29" />
</authentication>

<sessionState timeout="30" mode="InProc" cookieless="false" />

Sie können diese Zeile in Ihren Site.Master einfügen:

Response.AppendHeader("Refresh", 
                      Convert.ToString((Session.Timeout * 60)) + 
                      ";URL=~/Login.aspx");
2
ersegun

Ich benutze MVC3 ASp.net als Anfänger. Ich habe viele Lösungen ausprobiert, um mein Sitzungsproblem zu lösen (da ich Session-Variable in meinem Code verwende, und nach dem Timeout hatte ich keine Sitzungswerte, während ich es weiter benutze Ich habe gerade festgestellt, dass mein Problem in der Konfigurationsdatei lag. Das Timeout zwischen Authentication und sessionState sollte so nah sein, dass sie gleichzeitig (leer) getötet werden // zum Testen Timeout 1 und 2 hinzufügen. Es sollte mindestens 29 sein 30 __.

Ich habe andere auch so benutzt, wie es funktioniert:

Ab :

    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();          
    }

Und :

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);
    }
}

Und sogar mit Ajax zusammengearbeitet, um die Sitzung zu lösen:

    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

Natürlich müssen Sie [Authorize] über die Controller-Klasse oder sogar über Action speziell verwenden.

[Authorize]
public class MailController : Controller
{
}
1
Rasha

Wenn Sie den folgenden Anmeldungscontroller verwenden, werden Sie vor der Anmeldung an die angeforderte URL gesendet:

   [HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {

        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.UserName, model.Password))
            {

                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

                if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                    && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                {
                    //return Redirect(returnUrl);
                    if (!String.IsNullOrEmpty(returnUrl))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                      return RedirectToAction("Index", "Home");
                    }

                }
                else
                {
                    return RedirectToAction("Index", "Home");
                }
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }
1
Rasha

Leider ist das nicht möglich. Das Sitzungszeitlimit tritt nur auf der Serverseite auf und Sie können dies erst feststellen, wenn der Benutzer eine Art Post-Back-Aktion ausführt.

Was Sie jedoch tun können, ist das Einfügen von HTML- oder JavaScript-Header-Code, der den Benutzer automatisch zu einer Abmelde-Seite im selben Zeitraum wie Ihr Sitzungszeitlimit pusht. Dies garantiert keine perfekte Synchronisierung, und es kann zu Problemen kommen, wenn Ihr Benutzer zeitintensive Elemente ausführt und Sie die Uhr nicht zurücksetzen.

Ich füge diesen Code normalerweise zu meinen Page Load-Ereignissen hinzu, um dies zu erreichen.

' 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

Nun, das wird schwierig für AJAX - Anfragen, wie Zhaph - Ben Duguid darauf hinwies. Hier war meine Lösung, um diese Funktion mit AJAX auszuführen (mit Telerik-Websteuerelementen, die jedoch mit ASP.NET AJAX - Toolkit erstellt werden, glaube ich).

Kurz gesagt, ich rollte meine eigene Sache mit gleitenden Verfallszeiten.

In meinem Site.Master aktualisiere ich eine Sitzungsvariable für JEDES Postback (Postback- oder AJAX -Anforderung, da AJAX -Anfragen immer noch das Ereignis PageLoad auslösen):

protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            if (this.Request.IsAuthenticated)
                this.pnlSessionKeepAlive.Visible = true;
            else
                this.pnlSessionKeepAlive.Visible = false;
        }

        if (this.Session["SessionStartDateTime"] != null)
            this.Session["SessionStartDateTime"] = DateTime.Now;
        else
            this.Session.Add("SessionStartDateTime", DateTime.Now);
    }

Dann habe ich in meinem Markup für meine Site.master einen iframe mit einer ASPX-Seite eingefügt, die ich "hinter den Kulissen" verwende, um zu überprüfen, ob mein benutzerdefinierter Ablauf abgelaufen ist:

<asp:Panel runat="server" ID="pnlSessionKeepAlive" Visible="false">
 <iframe id="frame1" runat="server" src="../SessionExpire.aspx" frameborder="0" width="0" height="0" / >
 </asp:Panel>

Jetzt auf meiner SessionExpire.aspx-Seite aktualisiere ich einfach die Seite immer wieder und überprüfe, ob der Zeitstempel abgelaufen ist. Wenn ja, leite ich auf meine logout.aspx-Seite um, auf der die Anmeldeseite festgelegt wird, an die der Benutzer zurückgeschickt werden soll:

public partial class SessionExpire : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        /* We have to do all of this because we need to redirect to 2 different login pages. The default .NET
         * implementation does not allow us to specify which page to redirect expired sessions, its a fixed value.
         */
        if (this.Session["SessionStartDateTime"] != null)
        {
            DateTime StartTime = new DateTime();
            bool IsValid = DateTime.TryParse(this.Session["SessionStartDateTime"].ToString(), out StartTime);
            if (IsValid)
            {
                int MaxSessionTimeout = Convert.ToInt32(ConfigurationManager.AppSettings["SessionKeepAliveMins"]);
                IsValid = (DateTime.Now.Subtract(StartTime).TotalMinutes < MaxSessionTimeout);
            }

            // either their session expired or their sliding session timeout has expired. Now log them out and redirect to the correct
            // login page.
            if (!IsValid)
                this.Logout();
        }
        else
            this.Logout();

        // check every 60 seconds to see if the session has expired yet.
        Response.AddHeader("Refresh", Convert.ToString(60));
    }

    private void Logout()
    {
        this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "TimeoutScript",
                    "setTimeout(\"top.location.href = '../Public/Logout.aspx'\",\"1000\");", true);
    }
}

Vielen Dank an die oben genannten Personen, die Informationen gepostet haben. Dies hat mich zu meiner Lösung geführt und hoffe, dass sie anderen hilft.

0
Chris Smith