Cookie 响应状态代码被覆盖



我们正在开发一个基于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 的身份验证,它在启动中声明得有点像这样:

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

现在的事情是,如果我不像

options.Cookies.ApplicationCookie.CookieDomain = "localhost";

如果 ajaxCalls 对过期会话发出请求,则会收到 401。但是设置好了,我只收到404。如您所见,我尝试在OnRedirectToLogin上添加一个事件处理程序,该处理程序设置状态代码。不过,我会在客户端/浏览器上收到 404。

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

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

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

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

如果发生错误或其他情况,则会显示相应的页面。现在,MyController 没有处理 401 错误的方法,为此他最终返回了 404 错误。

最新更新