我们正在开发一个基于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域如何与它有关,或者至少可以指向正确的方向,那么它就会受到很大的影响。
答案 0 :(得分:0)
我找到了解决问题的方法。并不是该领域与它有很大关系(有些是,但它不是问题的根源)。
在我们这个项目的实时环境中,我们显然不希望显示“本机”错误或异常消息。因此,添加了一些处理程序
java\jre\lib\fonts
如果发生错误或其他错误,显示相应的页面。现在,MyController没有401错误的方法,然后他为此返回了404错误。