Почему мои запросы 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