Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax 使用ASP.NET MVC,会话过期时重定向到登录页面_Ajax_Asp.net Mvc - Fatal编程技术网

Ajax 使用ASP.NET MVC,会话过期时重定向到登录页面

Ajax 使用ASP.NET MVC,会话过期时重定向到登录页面,ajax,asp.net-mvc,Ajax,Asp.net Mvc,我正在使用ASP.NETMVC。我想在会话到期时重定向到登录页面。我怎样才能做到这一点?如果我在控制器中对一个方法进行AJAX调用,那么如果我的会话在这种情况下过期,我也希望重定向到登录页面。您可以通过3种方式完成此操作: 为您的操作创建一个过滤器,并在OnActionExecuting(操作执行之前)中编程一个代码 创建基类(从控制器类继承)并使控制器从此基类继承。在这个类中,您可以覆盖名为OnActionExecuting的方法,比如过滤器 不要使用会话进行身份验证,您可以使用表单身份验证并

我正在使用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)