Виртуальные машины Azure не содержат сеанс пользователя, вошедшего в систему

Я разрабатываю приложение MVC4. Мы разместили наше приложение в модели Windows Azure IAAS. Прямо сейчас мы настроили 2 виртуальные машины, и все работает хорошо. Но у нас есть проблема с ведением журнала пользователей.

Если я вхожу в виртуальную машину 1, она не переносится, когда следующий запрос поступает с виртуальной машины 2. Мы сопоставили две виртуальные машины с балансировкой нагрузки.

Должен ли я изучить решения Cache. Любая информация будет очень полезна...

Спасибо, Джасвант


person Jaswanth Krishna    schedule 18.05.2015    source источник
comment
Вы убедились, что ваш машинный ключ идентичен на обоих серверах? В противном случае шифрование, используемое для шифрования идентификационного файла cookie, не удастся расшифровать на другом сервере.   -  person Erik Funkenbusch    schedule 19.05.2015
comment
@Erik Funkenbusch: Да, это сработало, большое спасибо, Эрик. Я не уверен, как я пропустил эту часть... как-то неправильно ведет к чему-то   -  person Jaswanth Krishna    schedule 20.05.2015


Ответы (2)


Вы сталкиваетесь с двумя совершенно отдельными виртуальными машинами (да, с балансировкой нагрузки, но отдельными). Это обуславливает необходимость хранения любых типов данных сеанса, внешних по отношению к виртуальным машинам (или вам необходимо синхронизировать содержимое сеанса и сделать его идентичным на обеих виртуальных машинах).

Azure ничего не делает для синхронизации данных сеанса. Это зависит от вас, чтобы встроить его в архитектуру вашего приложения. Вы упомянули кэширование, которое, безусловно, является жизнеспособным решением (впрочем, какое решение выберете вы сами). Существуют и другие решения, такие как хранилище сеансов на основе базы данных. Опять же, это зависит от вас.

Но итог: если вы собираетесь масштабировать приложение за пределы одного сервера (в данном случае виртуальной машины) с балансировкой нагрузки, вы не можете хранить данные сеанса в конкретной виртуальной машине.

person David Makogon    schedule 18.05.2015
comment
Я использую аутентификацию на основе утверждения личности. Так что мне нужно добавить этот объект в ключ Redis Cache и получить его, если он существует? Я очень новичок в этом механизме кэширования на Azure. - person Jaswanth Krishna; 18.05.2015
comment
Какое отношение Identity имеет к сеансу? - person Erik Funkenbusch; 19.05.2015
comment
@erik вы можете предложить какое-нибудь решение для этого ?? - person Jaswanth Krishna; 19.05.2015
comment
@JaswanthKrishna - я уже сделал это, но ты не прокомментировал это. - person Erik Funkenbusch; 19.05.2015
comment
@erik funkebusch - вот в чем проблема .. Я авторизую пользователя с помощью wif ... он отлично работает на одной машине .. теперь у меня 2 машины ... если я захожу на одну машину .. токен безопасности или авторизация не не переносится ... Так что мне нужно поддерживать это в распределенном кеше ... вот где я застрял ... - person Jaswanth Krishna; 19.05.2015
comment
@JaswanthKrishna - распределенный кеш не имеет ничего общего с вашей проблемой. Ваша проблема в том, что ваш машинный ключ не одинаков на обоих серверах. - person Erik Funkenbusch; 19.05.2015
comment
@Erik Funkenbusch: Это сработало :( ..... я знаю, что меня вводят в заблуждение :( ... Большое спасибо, Эрик ... очень хороший материал. Можете ли вы просветить меня по поводу рисков безопасности в этом процессе? - person Jaswanth Krishna; 20.05.2015
comment
@JaswanthKrishna - угроз безопасности нет ... у вас должен быть один и тот же машинный ключ на обоих серверах, если они оба собираются создавать и декодировать одни и те же файлы cookie. - person Erik Funkenbusch; 20.05.2015

Используйте надежное хранилище состояния сеанса (например, Redis или SQL Server и т. д.) или поместите свое состояние в файл cookie и читайте/записывайте его при каждом запросе. Если файл cookie содержит конфиденциальный контент, зашифруйте его.

person Paul Fryer    schedule 18.05.2015
comment
я использую WIF, и я хотел использовать Redis. Можете ли вы поделиться больше света по этому ..... - person Jaswanth Krishna; 18.05.2015
comment
Хорошо, затем используйте RedisSessionStateProvider, чтобы установить и получить состояние сеанса (WIF Claims), связанное с вашим сеансом. blogs.msdn.com/b/webdev/archive/2014/05/12/ - person Paul Fryer; 18.05.2015
comment
Кроме того, если вы не используете поставщика сеансов ASP.Net, вам необходимо напрямую управлять получением и установкой значений кэша, в этом случае используйте библиотеку, например Redis CacheSharp. nuget.org/packages/CacheSharp.Redis - person Paul Fryer; 18.05.2015
comment
Можете ли вы немного объяснить, что касается cachesharp? - person Jaswanth Krishna; 18.05.2015
comment
Конечно, вот несколько ссылок fryerblog.com/post/99933007601/net-distributed-caching --- fryerblog.com/post/96993113611/ --- fryerblog.com/post/63388702380/distributed-caching-strategy - person Paul Fryer; 18.05.2015
comment
Спасибо за сообщение в блоге. Они информативны. Итак, когда я вхожу в систему, используя заявки WIF... нужно ли мне тогда настраивать кеш Redis? любые примеры кода с грубым способом будут очень полезны... - person Jaswanth Krishna; 18.05.2015
comment
Да, вам нужно настроить кеш Redis, вы можете сделать это на портале Azure, просто выберите самый дешевый (например, 15 долларов в месяц). Затем вам нужно кэшировать вещи, используя ключ, который можно найти на всех ваших веб-серверах (например, идентификатор сеанса из файла cookie). У вас должен быть какой-то файл cookie сеанса или что-то, что вы можете получить из каждого запроса. Это должно быть частью ваших ключей кеша. Возможно, вам следует опубликовать некоторый код, показывающий, что происходит во время аутентификации, чтобы мы могли видеть, какой сеанс/токен/и т. д. генерируется и используется для аутентификации. - person Paul Fryer; 18.05.2015
comment
var identity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, xyz) )), }, DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role); Аутентификация.SignIn(удостоверение личности); - person Jaswanth Krishna; 18.05.2015
comment
Это все, что я делаю в своем WIF... сохраняю имя и аутентифицирую его на основе имени... - person Jaswanth Krishna; 18.05.2015
comment
кто-то унизил этот ответ ... не знаю, почему ... мы идем в неправильном направлении? - person Jaswanth Krishna; 19.05.2015
comment
Вы видели мой код ... Я все еще не мог найти решение, часы тикают :( ... так что я помещаю файл cookie или сеанс в кеш Redis - person Jaswanth Krishna; 19.05.2015