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 错误。
我们正在使用 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
现在的问题是,如果我不像
那样设置 cookieDomainoptions.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 错误。