2016-10-27 5 views
2

Когда я работал с классическим ASP.NET или даже со старыми веб-формами, HttpContext.Current.Session был специфичным для пользователя. Поэтому, когда пользователь делает запрос, он получает файл cookie сеанса, а затем этот сеанс принадлежит только этому пользователю. Таким образом, два разных пользователя могут иметь ключ сеанса с тем же именем в своем соответствующем сеансе.Является ли сессия asp.net основной не специфичной для пользователя?

Я читаю документацию по сеансу в ASP.NET Core и, похоже, имеет ту же концепцию, что и старый asp.net, но записи в документации в документации сбивают с толку.
here это говорит

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

также here он говорит

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

так что позволяет сказать, у меня есть User1 войти в систему и на какое-то действие я установить

`Session.SetInt32("key1", 123)` 

Теперь Пользователь2 входит в с другой машине и на какое-то действие я установить

`Session.SetInt32("key1", 999)` 

Вопрос 1
Будет ли это перезаписывать ключ User1?

отметить также here говорит

ASP.NET поставляется с несколькими реализациями IDistributedCache, включая опции в памяти (для использования в процессе разработки и тестирования только)

Вопрос 2
Какова другая реализация IDistributedCache, которую я могу использовать в процессе производства?

ответ

2

# 1

сессия не привязана к пользователю, потому что сессия только идентифицируются это ключ сеанса, так что если кто-то получает владение ключа сеанса/куки, он может получить доступ к нему.

Asp.Net Core Identity имеет свой собственный файл cookie (если вы используете аутентификацию cookie), а Session middleware также использует свой собственный файл cookie.

Естественно, вы также можете использовать сеансы без пользователя. Возьмите Google.com, например. Когда вы впервые посещаете Google, он показывает политики и устанавливает cookie сеанса. Все настройки, которые вы выполняете (т. Е. Фильтр зрелости), будут сохранены в сеансе, который получает доступ каждый раз, когда вы выполняете поиск.

Все это без входа в систему, поэтому пользователя нет.

# 2

Open Source является вашим другом: https://github.com/aspnet/Caching/tree/dev/src

Redis и SqlServer являются по умолчанию распределены кэширует, с InMemory быть для разработки/только одноузловой. Также могут быть другие сторонние библиотеки, которые добавляют поддержку. не

+0

для # 1 как это отличается от классического asp.net? сессия в классическом asp.net работает так же, как я думаю. Кроме того, если сеанс не рекомендуется, то какой вариант я должен хранить для пользовательских данных – LP13

+0

Я не сказал, что его не рекомендуется, зависит от того, где вы его используете (в WebAPI его довольно плохая идея, поскольку служба WebAPI/REST должна быть апатридом) , для MVC его довольно хорошо использовать. Если вы хотите привязать его к пользователю, сохраните идентификатор пользователя и ip в нем, сравните его по каждому запросу (т. Е. Напишите промежуточное программное обеспечение, которое его проверит и, если необходимо, аннулирует сеанс, если пользователь и сохраненный идентификатор пользователя не совпадают) – Tseng

+0

Это не отличается от классики, но люди, особенно раздражающие инструменты сканирования безопасности, иногда предполагают, что сеанс связан с пользователем, поэтому мы называем его понятным. – blowdart

4

К вопросу 1.

Нет, один пользователь модификации ключа сеанса не будет перезаписывать ключ другого пользователя. Сеанс уникален для каждого посетителя/пользователя из-за созданного cookie .AspNetCore.Session.

Все вызовы Session.Set сохраняются на этот уникальный идентификатор.

 Смежные вопросы

  • Нет связанных вопросов^_^