【问题标题】:Cookie Response Statuscode gets overwrittenCookie 响应状态码被覆盖
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-12-21
    • 2014-01-08
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 2018-04-30
    • 2011-11-30
    • 2017-01-30
    • 2011-12-21
    相关资源
    最近更新 更多