Asp.net mvc 4 .Net MVC-显示“;“会话已过期”;只适用于私人网页

Asp.net mvc 4 .Net MVC-显示“;“会话已过期”;只适用于私人网页,asp.net-mvc-4,session,Asp.net Mvc 4,Session,我正在开发一个.NETMVC4应用程序,如果用户在会话超时后执行某些操作,它需要向用户显示“会话过期”消息 我使用的是具有很长超时的窗体身份验证和具有较短超时的sesion,因此我可以知道会话是否已过期或是新访问者。这是我的Web.config部分: <authentication mode="Forms"> <forms loginUrl="~/Login" timeout="10080" defaultUrl="~/Index" /> </authentic

我正在开发一个.NETMVC4应用程序,如果用户在会话超时后执行某些操作,它需要向用户显示“会话过期”消息

我使用的是具有很长超时的窗体身份验证和具有较短超时的sesion,因此我可以知道会话是否已过期或是新访问者。这是我的Web.config部分:

<authentication mode="Forms">
  <forms loginUrl="~/Login" timeout="10080" defaultUrl="~/Index" />
</authentication>
<sessionState mode="InProc" timeout="20" />
所有这些都适用于需要登录的网站的私人部分。问题是,如果用户登录,等待会话超时,然后尝试打开一个不需要登录的“公共”页面,他仍然会收到“会话已过期”消息。这就是我想要避免的。只有当用户试图访问需要登录的页面时,才应向用户显示“会话过期”消息

我曾尝试在Session_Start中设置一个标志,并在稍后的Global.asax事件中重定向,但没有成功,因为我遇到了一些可变的可访问性问题。 我想尝试检查当前操作是否具有
[AllowAnonymous]
属性,这样我就可以跳过重定向,但我不知道怎么做。 我读到的一些答案给我的印象是,“会话过期”逻辑应该在自定义属性中,但我不知道这是否是正确的方法


我的问题是,在.Net MVC 4中,实现仅“私有”页面的“会话过期”的最佳方法是什么?

正如您所说,理想的方法是使用属性。更确切地说,此属性名为“”

您可以创建实现接口的ActionFilter,也可以继承现有接口

在您的情况下,我认为获得结果的最简单方法是继承
AuthorizeAttribute
,并重写其
OnAuthorization
方法

在此方法中,您可以访问
HttpContext
作为
filterContext
参数的属性:
filterContext.HttpContext
。您可以使用此属性检查会话、授权,并检查它是否是ajax请求。如果需要重定向,必须通过设置
filterContext
参数的属性来实现:

filterContext.Result = new RedirectResult("...url to redirect to...");
您可以使用
RedirectResult
RedirectToRouteResult
构造函数的任何重载

如果保持
Result
属性不变,则不会发生任何特殊情况


您可以使用此自定义属性而不是原始授权属性。

是否有办法在操作筛选器中知道会话是否刚刚在此请求中创建?否则。。。我如何知道用户是新访问者还是会话已过期的旧访问者?您可以使用自定义cookie作为标志。您可以注册一个全局操作筛选器来处理此cookie。如果请求中不存在自定义cookie,并且使用了会话,则将cookie设置为“新会话”。如果请求中已经存在cookie,并且会话处于活动状态,请将其更改为“旧会话”。如果cookie存在,但会话已过期,请将其标记为“上一个会话已过期”。你不必完全这样做,这只是你能做的一个草图。谢谢,我几天后会试试,让你知道它是怎么做的。
filterContext.Result = new RedirectResult("...url to redirect to...");