2013-10-15 4 views
6

У меня очень интересная, но неприятная проблема. У меня есть сайт MVC 4, работающий со стандартной аутентификацией ASP.NET.IE10 и Windows 8 и ASP.NET MVC (IIS 7)

Только в сочетании IE 10 в Windows 8, когда я пересекаю свой сайт и перехожу к URL-адресу http с https-url (оба на одном сайте), он генерирует другое значение asp.net_sessionid. В каждом другом браузере/ОС комбо я попытался, это, похоже, не проблема.

Я искал высоко и низко, и, хотя я, конечно, обнаружил, что люди испытывают различные проблемы с аутентификацией (как правило, в отношении IIS7, не признающего IE10 в качестве браузера), я не нашел никого, кто утверждал бы, что испытал эту точную проблему. Более того, я опубликовал проект шаблона MVC «из коробки» и имеет ту же проблему. Я не могу быть единственным, кто столкнулся с этой проблемой (надеюсь, надеюсь).

Кто-нибудь еще сталкивается с этим? Или, может быть, даже есть какие-то предложения?

Благодаря

UPDATE

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

+1

возможно дубликат [Как я могу поделиться asp.net сеанса между HTTP и https] (http: // stackoverflow.com/questions/567535/how-can-i-share-a-asp-net-session-between-http-and-https) –

+3

Я не знаю, почему он работает в других браузерах, но этого не должно быть. Если вы не настроите cookie сеансов на безопасное, они всегда будут отличаться между http и https. –

+0

Да, хорошие моменты, но мое понимание было b/c. Я не настраивал свой файл cookie на «secure = true», чем cookie должен сохраняться между https и http. Является ли это хорошей практикой или нет, это желание клиента. –

ответ

1

Вы упомянули, что у вас была эта проблема в сбалансированной нагрузке среде, верно? Я предполагаю, что вы используете метод «In Proc» по умолчанию для хранения данных сеанса. Если это так, то я думаю, что знаю, что может произойти. (ради аргумента, я возьму на себя 2 сервера, но на самом деле не имеет значения, есть ли у вас больше)

Вы отправляетесь на сервер A и создается сеанс. Потому что это In Process ServerB не имеет представления об этом. В конце концов (и как это происходит, это вопрос о том, как настроен ваш балансировщик. Sticky session? Cookies? Round robin?), Вы будете отправлены на ServerB. Поскольку у этого сервера нет идеи у вас уже есть сеанс; создается новый, и вам присваивается новый идентификатор сеанса.

Так почему это происходит под вашими точками воспроизведения? Ну, я подозреваю, что, учитывая достаточное время и нагрузку, вы увидите, что он просто перемещается с/page1 на/page2. Опять же - это зависит от того, как настроен ваш балансировщик нагрузки, но это может быть так, потому что вы меняете протокол, который запускает что-то, и вы отправляетесь на другой сервер в пуле.

Как вы можете это исправить?
Для начала убедитесь, что у вас есть тот же машинный ключ в файле machine.config. Если у вас нет доступа к этому, я думаю, что он будет работать в web.config, но я не пробовал.

Теперь настройте другой способ хранения состояния сеанса. Возможно, на сервере Sql или MySql или Postgres или где угодно. Если у вас есть SQL Server, который будет самым простым с момента его создания, но если у вас есть другое хранилище данных, вам нужно будет либо построить, либо найти библиотеку, которая это сделает. Я работал над проектом, в котором мы использовали Postgres для хранения состояния сеанса.

Мы использовали npgsql в качестве драйвера для conenct на сервер, и построили наши собственные PgsqlSessionProvider:SessionStateStoreProviderBase и закреплять его на самом деле очень легко

<sessionState mode="Custom" customProvider="PgsqlSessionProvider"> 
    <providers> 
    <add name="PgsqlSessionProvider" type="My.namespace.PgsqlSessionStateStore" connectionStringName="connectionStringName" writeExceptionsToEventLog="true" /> 
    </providers> 
</sessionState> 
Смежные вопросы