Можно обработать это в global.asax в событии Session_Start. Можно проверить на сеансовые куки в запросе там. Если сеансовые куки существуют, сессия истекла:
public void Session_OnStart()
{
if (HttpContext.Current.Request.Cookies.Contains("ASP.NET_SessionId") != null)
{
HttpContext.Current.Response.Redirect("SessionTimeout.aspx")
}
}
Увы я не нашел изящного способа узнать название сеансовых куки.
Я обычно добавляю управление HtmlMeta к Странице. Заголовок. Набор средств управления на основной странице, когда пользователь "вошел в систему". Установите его для Обновления к странице SessionExpired.aspx с соответствующей продолжительностью тайм-аута, и Вы хороши пойти.
Если я понимаю правильно, огни "Session_End" внутренне, и не связали контекст HTTP с ним:
http://forums.asp.net/t/1271309.aspx
Поэтому я не думаю, что Вы могли использовать его для перенаправления пользователя. Я видел, что другие предлагают использовать событие "Session_OnStart()" в global.ascx файле:
http://forums.asp.net/p/1083259/1606991.aspx
Я не попробовал его, но вставление следующего кода "global.ascx" мог бы работать на Вас:
void Session_OnStart() {
if (Session.IsNewSession == false )
{
}
else
{
Server.Transfer("SessionExpired.aspx", False);
}
}
Мы используем Аутентификацию Форм и называем этот метод в методе Page_Load
private bool IsValidSession()
{
bool isValidSession = true;
if (Context.Session != null)
{
if (Session.IsNewSession)
{
string cookieHeader = Request.Headers["Cookie"];
if ((null != cookieHeader) && (cookieHeader.IndexOf("ASP.NET_SessionId") >= 0))
{
isValidSession = false;
if (User.Identity.IsAuthenticated)
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
}
}
}
return isValidSession;
}
Другой путь состоит в том, чтобы сказать браузеру перенаправлять себя (с помощью JavaScript) после определенного количества времени..., но это может всегда деактивироваться пользователем.
Вы помещаете что-то в объект Сессии, который должен всегда быть там? Другими словами, если они входят в систему, можно помещать что-то как UserID на сессии
Session("UserID") = 1234
Так, если это так, затем Вы могли добавить что-то к своему codebehind на основной странице, которая проверяет на то значение. Что-то вроде этого:
Dim UserID As Integer = 0
Integer.TryParse(Session("UserID"), UserID)
If UserID = 0 Then
Response.Redirect("/sessionExpired.aspx")
End If
Добавьте или обновите свою сеть. Файл конфигурации для включения этого или чего-то подобного:
<customErrors defaultRedirect="url" mode="RemoteOnly">
<error statusCode="408" redirect="~/SessionExpired.aspx"/>
</customErrors>
Вы обращаетесь к перенаправлению по следующему запросу или сразу перенаправляете без вмешательства пользователя? Если Вы обращаетесь к перенаправлению без вмешательства пользователя, то можно использовать ClientScript. RegisterStartupScript на Вашем Ведущем устройстве Page для введения небольшого количества JavaScript, который перенаправит клиенты, когда их сессия истечет.
System.Text.StringBuilder sb = new System.Text.StringBuilder();
String timeoutPage = "SessionExpired.aspx"; // your page here
int timeoutPeriod = Session.Timeout * 60 * 1000;
sb.AppendFormat("setTimeout(\"location.href = {0};\",{1});", timeoutPage, timeoutPeriod);
Page.ClientScript.RegisterStartupScript(this.GetType(), "timeourRedirect", sb.ToString(), true);
Вы не можете перенаправить пользователя, когда сессия истекает, потому что нет никакого запроса браузера для перенаправления:
Кроме клиентской функции (например, таймер JavaScript и т.д.), поэтому необходимо обработать перенаправление в Session_OnStart вместо этого - но очевидно необходимо отличить это от кого-то приезжающего в сайт заново. Одна опция состоит в том, чтобы установить сеансовые куки, когда их сессия запускается (т.е. cookie без истечения так, чтобы это только продлилось, пока браузер не закрывается), затем ищите тот cookie в Session_OnStart - если это присутствует, это - возвращающийся пользователь с сессией с истекшим сроком, если не это - новый пользователь.
Очевидно, можно все еще использовать Session_OnEnd для уборки на стороне сервера - это - просто клиентское взаимодействие, которое не доступно Вам.
namespace PAB.WebControls
{использование Системы; использование Системы. ComponentModel; использование Системы. Сеть; использование Системы. Сеть. Безопасность; использование Системы. Сеть. UI;
[DefaultProperty("Text"),
ToolboxData("<{0}:SessionTimeoutControl runat=server></{0}:SessionTimeoutControl>")]
public class SessionTimeoutControl : Control
{
private string _redirectUrl;
[Bindable(true),
Category("Appearance"),
DefaultValue("")]
public string RedirectUrl
{
get { return _redirectUrl; }
set { _redirectUrl = value; }
}
public override bool Visible
{
get { return false; }
}
public override bool EnableViewState
{
get { return false; }
}
protected override void Render(HtmlTextWriter writer)
{
if (HttpContext.Current == null)
writer.Write("[ *** SessionTimeout: " + this.ID + " *** ]");
base.Render(writer);
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
if (this._redirectUrl == null)
throw new InvalidOperationException("RedirectUrl Property Not Set.");
if (Context.Session != null)
{
if (Context.Session.IsNewSession)
{
string sCookieHeader = Page.Request.Headers["Cookie"];
if ((null != sCookieHeader) && (sCookieHeader.IndexOf("ASP.NET_SessionId") >= 0))
{
if (Page.Request.IsAuthenticated)
{
FormsAuthentication.SignOut();
}
Page.Response.Redirect(this._redirectUrl);
}
}
}
}
}
}