ASP.NET: Session.SessionID изменяется между запросами - PullRequest
129 голосов
/ 20 мая 2010

Почему свойство SessionID объекта Session на странице ASP.NET изменяется между запросами?

У меня есть такая страница:

...
<div>
    SessionID: <%= SessionID %>
</div>
...

И вывод постоянно меняется каждый раз, когда я нажимаю F5, независимо от браузера.

Ответы [ 13 ]

204 голосов
/ 20 мая 2010

Это причина

При использовании состояния сеанса на основе файлов cookie ASP.NET не выделяет хранилище для данных сеанса, пока не будет использован объект сеанса. В результате новый идентификатор сеанса генерируется для каждого запроса страницы, пока не будет получен доступ к объекту сеанса. Если вашему приложению требуется статический идентификатор сеанса для всего сеанса, вы можете либо реализовать метод Session_Start в файле приложения Global.asax и сохранить данные в объекте Session для исправления идентификатора сеанса, либо использовать код в другой части вашего приложение для явного хранения данных в объекте Session.

http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.sessionid.aspx

Таким образом, в основном, если вы не обращаетесь к своему объекту сеанса в бэкэнде, новый sessionId будет генерироваться с каждым запросом

EDIT

Этот код необходимо добавить в файл Global.asax. Он добавляет запись в объект Session, поэтому вы фиксируете сеанс до его истечения.

protected void Session_Start(Object sender, EventArgs e) 
{
    Session["init"] = 0;
}
85 голосов
/ 19 августа 2011

Существует еще одна, более коварная причина, по которой это может произойти, даже если объект Session был инициализирован, как продемонстрировал Cladudio.

В файле Web.config, если есть запись <httpCookies>, установленная на requireSSL="true", но вы на самом деле не используете HTTPS: для конкретного запроса файл cookie сеанса не отправляется (или, возможно, не возвращается, Я не уверен, что), что означает, что вы заканчиваете с совершенно новым сеансом для каждого запроса.

Я нашел этот путь трудным, потратив несколько часов на переключение между несколькими коммитами в моем контроле исходного кода, пока не обнаружил, какое конкретное изменение нарушило мое приложение.

5 голосов
/ 14 марта 2013

В моем случае я выяснил, что cookie-файл сеанса имеет домен , который включает префикс www., а я запрашивал страницу без www..
Добавление www. к URL немедленно решило проблему. Позже я изменил домен cookie на .mysite.com вместо www.mysite.com.

4 голосов
/ 20 января 2013

Используя ответ Невилла (удаляя requireSSL = true, в web.config) и слегка изменяя код Джоэла Эертона, вот код, который должен обрабатывать сайт, который работает как в режиме SSL, так и в режиме не SSL, в зависимости от пользователя и страницы (я возвращаюсь к коду и еще не тестировал его на SSL, но ожидаю, что он должен работать - позже будет слишком занят, чтобы вернуться к этому, поэтому вот оно:

if (HttpContext.Current.Response.Cookies.Count > 0)
        {
            foreach (string s in HttpContext.Current.Response.Cookies.AllKeys)
            {
                if (s == FormsAuthentication.FormsCookieName || s.ToLower() == "asp.net_sessionid")
                {
                    HttpContext.Current.Response.Cookies[s].Secure = HttpContext.Current.Request.IsSecureConnection;
                }
            }
        }
2 голосов
/ 22 октября 2013

Другая возможность, которая заставляет SessionID меняться между запросами, даже когда Session_OnStart определен и / или Session был инициализирован, заключается в том, что имя хоста URL содержит недопустимый символ (например, подчеркивание). Я полагаю, что это специфично для IE (не проверено), но если ваш URL, скажем, http://server_name/app, то IE заблокирует все куки, и ваша информация о сеансе не будет доступна между запросами.

Фактически, каждый запрос будет ускорять отдельный сеанс на сервере, поэтому, если ваша страница содержит несколько изображений, тегов сценариев и т. Д., То каждый из этих запросов GET приведет к отдельному сеансу на сервере.

Дополнительная информация: http://support.microsoft.com/kb/316112

1 голос
/ 04 января 2018

в моем случае это было потому, что я изменял сессию после перенаправления со шлюза во внешнее приложение , поэтому, поскольку я использовал IP вместо localhost в URL этой страницы, на самом деле он считался другим веб-сайтом с другим сессий.

В итоге

обращайте больше внимания, если вы отлаживаете размещенное приложение на IIS вместо IIS Express и смешиваете свою машину http://Ip и http://localhost на разных страницах

1 голос
/ 16 марта 2017

В моем случае это часто происходило в моей среде разработки и тестирования. После того, как все вышеперечисленные решения были безуспешными, я обнаружил, что смог решить эту проблему, удалив все сеансовые файлы cookie. Расширение веб-разработчика делает это очень просто. В основном я использую Firefox для тестирования и разработки, но это также происходило во время тестирования в Chrome. Исправление также работало в Chrome.

Мне еще не приходилось делать это в производственной среде, и я не получал никаких сообщений о людях, не имеющих возможности войти в систему. Это также, похоже, происходило только после того, как файлы cookie сеанса были безопасными. Такого не было в прошлом, когда они не были в безопасности.

1 голос
/ 18 февраля 2016

моя проблема была в том, что у нас был этот набор в web.config

<httpCookies httpOnlyCookies="true" requireSSL="true" />

это означает, что при отладке в не-SSL (по умолчанию) файл cookie аутентификации не будет отправлен обратно на сервер. это будет означать, что сервер будет отправлять новый файл cookie авторизации (с новым сеансом) для каждого запроса обратно клиенту.

Исправление: либо установить для requiressl значение false в web.config и значение true в web.release.config, либо включить SSL при отладке:

turn on SSL

1 голос
/ 16 апреля 2014

Моя проблема была связана с приложением Microsoft MediaRoom IPTV.Оказывается, что MPF-приложения MPML не поддерживают файлы cookie;переход на использование сеансов без файлов cookie в web.config решил мою проблему

<sessionState cookieless="true"  />

Вот ДЕЙСТВИТЕЛЬНО старая статья об этом: ASP.NET без файлов cookie

0 голосов
/ 11 декабря 2018

Я нахожусь на .NET Core 2.1 и хорошо знаю, что вопрос не в Core. Тем не менее, Интернета не хватает, и Google привел меня сюда, так надеясь сэкономить кому-то несколько часов.


Startup.cs

services.AddCors(o => o.AddPolicy("AllowAll", builder =>
            {
                builder
                    .WithOrigins("http://localhost:3000")     // important
                    .AllowCredentials()                       // important
                    .AllowAnyMethod()
                    .AllowAnyHeader();       // obviously just for testing
            }));

client.js

const resp = await fetch("https://localhost:5001/api/user", {
            method: 'POST',
            credentials: 'include',                           // important
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(data)
        })

Controllers/LoginController.cs

namespace WebServer.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class UserController : ControllerBase
    {
        [HttpPost]
        public IEnumerable<string> Post([FromBody]LoginForm lf)
        {
            string prevUsername = HttpContext.Session.GetString("username");
            Console.WriteLine("Previous username: " + prevUsername);

            HttpContext.Session.SetString("username", lf.username);

            return new string[] { lf.username, lf.password };
        }
    }
}

Обратите внимание, что запись и чтение сеанса работает, но файлы cookie, похоже, не передаются в браузер. По крайней мере, я нигде не мог найти заголовок "Set-Cookie".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...