Cookie 响应状态代码被覆盖

Cookie Response Statuscode gets overwritten

我们正在使用 Asp.Net MVC(并将在某个时候 upgrade/migrate 到 Core 2.0)开发一个基于 Web 的应用程序,其中用户的会话可能会用完。现在我们想抓住这一点,如果用户仍然在浏览器选项卡中登录,会话已过期并通过 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";

ajax如果他们使用过期的会话发出请求,呼叫将收到 401。但是设置后,我只收到 404。如您所见,我尝试在 OnRedirectToLogin 上添加一个事件处理程序,它设置了 Statuscode。尽管如此,我还是会在 client/browser 收到 404。

我不知道我设置的这个状态代码在哪里被覆盖,也不知道为什么我会遇到上述行为。如果有人能说出为什么会发生这种情况,cookie 域与它有什么关系,或者至少能为我指明正确的方向,我们将不胜感激。

我找到了问题的解决方案。并不是域名与它有多大关系(有点是,但它不是问题的根源)。

在这个项目的实际环境中,我们显然不想显示 "native" 错误页面或异常消息。因此,像这样添加了一些处理程序

 app.UseExceptionHandler("/MyController/Error");
 app.UseStatusCodePagesWithReExecute("/MyController/Error_{0}");

如果发生错误或其他情况,它会显示相应的页面。现在,MyController 没有针对 401 错误的方法,最后他返回了 404 错误。