会话在AJAX中过期后,ASP.NET MVC重定向到登录页面

时间:2018-03-14 12:25:07

标签: javascript c# ajax asp.net-mvc

我刚学习ASP.NET MVC和新手,所以我找不到解决某些问题的方法。也许有人遇到这个问题,可以给我建议吗?谢谢大家!

在我的项目中,我使用ASP.NET Identity进行授权。 我遇到的唯一问题是如何在会话到期后将用户重定向到登录页面。如果来自控制器的动作不是从AJAX调用它可以很好地工作,但是如果从AJAX函数调用动作它会崩溃。我寻找解决方案,但我发现的一切都不适合我。 现在我的代码看起来像:

Startup.cs

public void Configuration(IAppBuilder app)
        {
            app.CreatePerOwinContext<ApplicationContext>(ApplicationContext.Create);
            app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Home/Login"),
                LogoutPath = new PathString("/Home/Login"),
                ExpireTimeSpan = TimeSpan.FromMinutes(1),

            });
        }

Web.config

<system.web>
    <authentication mode="Forms">
    <forms loginUrl="~/Home/Login"  timeout="1" />
    </authentication>
  </system.web>

来自JS的函数调用action:

function click(d) {
                //Some logic
                    $.ajax({
                        url: '@Url.Action("GetDataForNode", "Home")',
                        type: 'POST',
                        dataType: 'json',
                        cahe: false,
                        data: { uid: d.id, index: index, nodesUid: nodesUid, request },
                        success: function (results) {
                            //Some logic
                        },
                        error: function (xhr) {
                            if (xhr.status === 401) {
                                window.location.href = xhr.Data.LogOnUrl;
                                return;
                            }
                        }
                    })
            }

在控制器中我创建了:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public class MyAuthorizeAttribute : AuthorizeAttribute
    {
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                filterContext.HttpContext.Response.StatusCode = 401;
                filterContext.Result = new JsonResult
                {
                    Data = new
                    {
                        Error = "NotAuthorized",
                        LogOnUrl = FormsAuthentication.LoginUrl
                    },
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
                filterContext.HttpContext.Response.End();

            }
            else
            {
                base.HandleUnauthorizedRequest(filterContext);
            }
        }
    }

执行后我得到了这个 enter image description here

1 个答案:

答案 0 :(得分:-1)

将生命周期方法Application_EndRequest处理程序添加到global.asax.cs中的代码中。每个请求都将以此方法结束,当您的请求未经授权时,此方法将允许您重定向到适当的操作(401),只需重定向到适当的操作。

   protected void Application_EndRequest()
        {                
            // redirected to the login page.
            var context = new HttpContextWrapper(Context);
            if (context.Request.IsAjaxRequest() && context.Response.StatusCode == 401)
            {
                new RedirectResult("~/Account/Login");
            }
        }
    }