Ajax 使用ASP.NET MVC,会话过期时重定向到登录页面
我正在使用ASP.NETMVC。我想在会话到期时重定向到登录页面。我怎样才能做到这一点?如果我在控制器中对一个方法进行AJAX调用,那么如果我的会话在这种情况下过期,我也希望重定向到登录页面。您可以通过3种方式完成此操作:Ajax 使用ASP.NET MVC,会话过期时重定向到登录页面,ajax,asp.net-mvc,Ajax,Asp.net Mvc,我正在使用ASP.NETMVC。我想在会话到期时重定向到登录页面。我怎样才能做到这一点?如果我在控制器中对一个方法进行AJAX调用,那么如果我的会话在这种情况下过期,我也希望重定向到登录页面。您可以通过3种方式完成此操作: 为您的操作创建一个过滤器,并在OnActionExecuting(操作执行之前)中编程一个代码 创建基类(从控制器类继承)并使控制器从此基类继承。在这个类中,您可以覆盖名为OnActionExecuting的方法,比如过滤器 不要使用会话进行身份验证,您可以使用表单身份验证并
在我看来,解决方案3比其他的好。我希望它对你有用 因为可以复制表单身份验证的安全cookie,所以使用它来模拟注册用户,我使用以下属性将身份验证绑定到当前会话生存期 要使该属性起作用,您必须在登录时设置session[“user”]=MyUser,并在注销时调用session.abandom()。 我不知道重定向是否适用于ajax调用,这是您必须尝试的
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class CheckUserSessionAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpSessionStateBase session = filterContext.HttpContext.Session;
var user = session["User"];
if (((user == null) && (!session.IsNewSession)) || (session.IsNewSession))
{
//send them off to the login page
var url = new UrlHelper(filterContext.RequestContext);
var loginUrl = url.Content("~/Account/LogOff");
session.RemoveAll();
session.Clear();
session.Abandon();
filterContext.HttpContext.Response.Redirect(loginUrl, true);
}
}
}
在这里可以找到另一个可行的解决方案:
这个答案在很大程度上是基于Michaels的,除了它有效之外;-) 我将其更改为接受一个代理检查会话是否已结束,以便它可以在不同的应用程序中工作,这些应用程序可能有不同的确定方法,并且在其他应用程序中登录页面可能不同。在Global.asax.cs应用程序_Start()中,我的应用程序中的代码是
CheckUserSessionAttribute.CheckSessionAlive = session => (session.GetUser() != null);
CheckUserSessionAttribute.LoginUrl = "~/Account/Login";
那么属性类如下所示
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class CheckUserSessionAttribute : ActionFilterAttribute
{
public static String LoginUrl { get; set; }
public delegate bool CheckSessionDelegate(HttpSessionStateBase session);
public static CheckSessionDelegate CheckSessionAlive;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpSessionStateBase session = filterContext.HttpContext.Session;
if ((CheckSessionAlive == null) || (CheckSessionAlive(session)))
return;
//send them off to the login page
var url = new UrlHelper(filterContext.RequestContext);
var loginUrl = url.Content(LoginUrl);
session.RemoveAll();
session.Clear();
session.Abandon();
filterContext.HttpContext.Response.StatusCode = 403;
filterContext.HttpContext.Response.Redirect(loginUrl, false);
filterContext.Result = new EmptyResult();
}
}
从控制器中,只需在类或单个操作上方添加[CheckUserSession]属性。解决方案3是错误的。使用表单身份验证,用户仍然可以通过cookie进行身份验证,但有一个全新的会话。如果您的控制器未捕获到此信息,则您在尝试访问登录页未配置的会话对象时可能会出现异常。解决方案1在技术上不正确。虽然是一个筛选器,但可以使用从
AuthorizeAttribute
和iaauthorizationFilter
派生的,然后根据情况覆盖OnAuthorization
和/或AuthorizeCore
。MVC2就是这样。@ErikPhilips,请您提供一个链接/示例以进一步说明。谢谢。一个问题有三个解决方案。砰的一声:)。并让我们知道您是否有更多解决此问题的方法;)重定向似乎对我不起作用。我有一个MVC移动网站,这似乎意味着一切都使用AJAX。不确定如何使重定向生效。如果我将此属性应用于类,如何编写反转属性以将其应用于操作?例如,我认为MVC框架不支持取消选中KuserSessionAttribute。据我所知,它将评估所有过滤器属性。我无法想象如何解决你的问题。因此,您必须将其应用于类中的每个方法。这似乎是在运行代码,但无论如何都要继续执行原始操作,这在我的情况下会导致错误,因为整个操作都希望会话中有一个用户,而实际情况并非如此。请注意:if(((user==null)&&(!session.IsNewSession))|(session.IsNewSession))
可以简单地重新编写为if(user==null | | session.IsNewSession)