Cookie响应状态代码被覆盖

时间:2018-03-07 12:35:22

标签: asp.net ajax session cookies http-status-codes

我们正在开发一个基于Web的应用程序,使用Asp.Net MVC(有些人会升级/迁移到Core 2.0),其中用户的会话可能会耗尽。现在我们要抓住这个,如果用户仍然在浏览器选项卡中登录,过期会话并通过ajax调用执行某些操作(点击smth。触发任何事情)。然后,我们可以在ajaxComplete中捕获返回的调用状态代码,如此

$(() => {
$(document).ajaxComplete((e, xhr, settings) => {
            var status = xhr.status;
            if (status === 401) {
                var returnUrl = window.location.pathname + window.location.search;
                window.location.href = `/Account/Login?returnUrl=${returnUrl}`;
            }
}

我们使用基于cookie的身份验证,在Startup中声明的方式有点像这样:

 services.AddIdentity<ApplicationUser, IdentityRole>(
            options =>
                {   
                options.Cookies.ApplicationCookie.SessionStore = new MemoryCacheTicketStore();
                    options.Cookies.ApplicationCookie.AuthenticationScheme = "OurMiddlewareInstance";
                    options.Cookies.ApplicationCookie.LoginPath = new PathString("/Account/Login/");
                    options.Cookies.ApplicationCookie.AccessDeniedPath = new PathString("/Account/AccessDenied/");
                    options.Cookies.ApplicationCookie.AutomaticAuthenticate = true;
                    options.Cookies.ApplicationCookie.AutomaticChallenge = true;
                    options.Cookies.ApplicationCookie.CookieSecure = CookieSecurePolicy.Always;
                    options.Cookies.ApplicationCookie.CookieHttpOnly = false;
                    options.Cookies.ApplicationCookie.SlidingExpiration = true;
                    options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromMinutes(30);
                    options.Cookies.ApplicationCookie.Events = new CookieAuthenticationEvents
                    {
                        OnRedirectToLogin = ctx =>
                            {
                                var isAjax = ctx.Request.IsAjaxRequest();
                                if (isAjax)
                                {
                                    ctx.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
                                    return Task.FromResult(0);
                                }
                                ctx.Response.Redirect(ctx.RedirectUri);
                                return Task.FromResult(0);
                            }
                    };
                    if (!_isDevelopment)
                    {
                        options.Cookies.ApplicationCookie.CookieDomain = "localhost";
                    }
                })
                // ... and some other stuff

现在的情况是,如果我没有设置cookieDomain像

那样
options.Cookies.ApplicationCookie.CookieDomain = "localhost";
如果ajaxCalls使用过期会话发出请求,则会收到401。但是设置它后,我只收到404.如你所见,我尝试在 OnRedirectToLogin 上添加一个事件处理程序,它设置了Statuscode。不过,我会在客户端/浏览器上收到404。

我不知道我设置的这个状态代码会被覆盖,或者为什么我会遇到这种行为。如果有人能说出为什么会发生这种情况,那么cookie域如何与它有关,或者至少可以指向正确的方向,那么它就会受到很大的影响。

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。并不是该领域与它有很大关系(有些是,但它不是问题的根源)。

在我们这个项目的实时环境中,我们显然不希望显示“本机”错误或异常消息。因此,添加了一些处理程序

java\jre\lib\fonts
如果发生错误或其他错误,

显示相应的页面。现在,MyController没有401错误的方法,然后他为此返回了404错误。