Почему мои запросы AJAX не расширяют сеанс OWIN MVC?

У нас есть приложение ASP.NET MVC 5, которое использует проверку подлинности на основе форм с истечением срока действия. Недавно мы переключились на OWIN Cookie Authentication и испытываем проблемы, когда наши сеансы не распространяются должным образом.

Ранее сеанс мог быть расширен с помощью запроса AJAX xhr. Однако с этой конфигурацией они не расширяются. Я получаю 200 для каждого запроса (как GET, так и POST), который должен расширяться, даже после того, как сервер убил сеанс.

Текущая настройка:

app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

UrlHelper url = new UrlHelper(HttpContext.Current.Request.RequestContext);
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
   AuthenticationType = "Cookies",
   CookieSecure = CookieSecureOption.SameAsRequest,
   CookieName = Constants.CatalystPortalCookieName,
   LoginPath = new PathString(url.Action(nameof(LoginController.Index), "Login")),
   SlidingExpiration = true,
   ExpireTimeSpan = TimeSpan.FromMinutes(20),
   CookiePath = "/",
});

Если я щелкнув ссылку, которая загружает всю страницу в качестве ответа на документ, сервер правильно расширяет сеанс.

Ответ 1

У меня были некоторые ошибочные предположения. Запросы AJAX расширялись. Возвращение 200 меня отбрасывало. Посмотрев с помощью скрипача на фактический ответ, я увидел, что с изменением на OWIN 401 фактически перемещается в ответ:

X-Responded-JSON: {"status":401,"headers":{...foo...}}

Итак, мы просто установили статус ответа на 401. Это, вероятно, ужасно, но оно соответствует нашим потребностям.

protected void Application_EndRequest() {
    var context = new HttpContextWrapper(Context);
    var header = context.Response.Headers["X-Responded-JSON"];
    if (header != null && header.Contains("\"status\":401")) {
        Context.Response.Clear();
        Context.Response.StatusCode = 401;
    }

Здесь возможно более надежное решение: OWIN: неавторизованный веб-сайт, возвращающий страницу входа, а не 401