【发布时间】:2018-08-15 13:37:20
【问题描述】:
我们正在使用 Asp.Net MVC 开发一个基于 Web 的应用程序(有时会升级/迁移到 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 上添加一个事件处理程序,该处理程序设置状态码。尽管如此,我还是会在客户端/浏览器上收到 404。
我不知道我设置的这个状态码在哪里被覆盖,也不知道为什么我会遇到上述行为。如果有人能说出为什么会发生这种情况,cookie 域与它有什么关系,或者至少可以指出我正确的方向,那将不胜感激。
【问题讨论】:
-
尝试升级到最新的软件包。我运行了您的代码,但无法重新创建您的错误
-
只要确保您的中间件设置正确。首先应该是静态文件->然后是身份验证->中间件的其余部分。如果您在某事后进行身份验证,可能会导致奇怪的结果
-
@UmarKarimabadi 我会尽快调查。事实上,这个问题的优先级只是降低了,并且出现了其他问题。如果需要几天时间,请多多包涵。
标签: asp.net ajax session cookies http-status-codes