Ведение сессии в Silverlight - PullRequest
       28

Ведение сессии в Silverlight

2 голосов
/ 20 августа 2009

Я создаю Silverlight с подключением WCF. Я хотел бы создать и поддерживать сеанс после входа пользователя в Silverlight и выполнять следующие действия.

  • При успешном входе в систему создайте объект сеанса и сохраните идентификатор сеанса, идентификатор пользователя, имя пользователя, статус сеанса
  • При последующих вызовах с WCF информацию о сеансе необходимо передавать из Silverlight в WCF

Одним из решений было бы создание объекта сеанса и передача его в качестве параметра всем методам.

Есть ли другой способ передачи информации во всех вызовах веб-службы без передачи переменной-члена?

Нечто подобное постоянному объекту Session в ASP.NET.

Ответы [ 6 ]

3 голосов
/ 28 августа 2009

Зачем вам каждый раз передавать информацию о сеансе?

Если вы используете ASP.NET для размещения своей службы WCF в режиме совместимости с ASP, вы можете установить режим инстанцирования на Session, чтобы затем хранить все это в переменных экземпляра вашей службы WCF. Или в вашем объекте сеанса ASP.

Я не вижу смысла отправлять все эти данные для каждого запроса.

Хорошая вещь, которую нужно сделать при использовании SL с ASP.NET, это войти в систему, используя встроенную аутентификацию ASP.NET Как здесь , а затем вы можете просто вызвать службу WCF и проверить, что HttpContext.Current.User.Identity.IsAuthenticated верно.

1 голос
/ 01 октября 2011

Хм .. вы можете использовать DB, чтобы помочь вам сделать это ..

это вещь ...

  1. Приложение Silverlight отправляет аутентификацию в службу авторизации wcf
  2. Служба входа WCF проверяет и создает сеанс в вашей сессии db
  3. WCF-логин вернет true при успешном входе и false в неавторизованном логине
  4. Глобальная переменная входа в магазин приложений Silverlight для последующего использования
  5. Теперь у вас есть информация в ваших приложениях и на вашем сервере:)

Следующая проблема: 1. Как удалить сессию на сервере? * просто создайте кнопку выхода из системы и позвоните в службу, чтобы удалить сеанс в базе данных * и удалите глобальную переменную для ваших приложений (переменная сеанса / переменная входа в систему)

  1. Как, если пользователь не нажимает кнопку выхода из системы?

    • на сайте сервера просто периодически проверяйте сессию. Если он больше не активен, удалите его.
  2. По сути, вы должны отправить свой идентификатор сеанса через Интернет, чтобы позвонить всем вашим службам и подтвердить, что вы являетесь аутентифицированным пользователем:)

Примечания: Ну, другого пути нет, так как служба не имеет статуса.

1 голос
/ 31 марта 2011

Сессии автоматически обрабатываются для вас, если в вашем браузере включены файлы cookie. Просто добавьте пустой файл Global.asax в ваше веб-приложение, и сессия будет создана автоматически по первому запросу браузера.

0 голосов
/ 22 августа 2009

Конечная цель - просто временно сохранить переменную пользователя, пока его браузер открыт. Независимо от внешнего вида, если это не мегабайты данных, я просто временно сохраняю их в переменной или ресурсе в памяти в приложении или классе, чтобы вам не пришлось беспокоиться о том, что они будут отображаться локально на их компьютере. Он исчезнет, ​​когда сессия браузера закончится.

App.Current.Resource.Add("MySessionItem", item)

При вызове WCF попытайтесь разрешить ASP.net выполнять аутентификацию для вас с помощью ASP. Application Services (т. Е. My.User.Identity), не проходить аутентификацию в ваших методах WCF на основе тех переданных параметров, которые вы храните в временная переменная и / или ресурс.

0 голосов
/ 21 августа 2009

Аутентификация WCF в silverlight выполняется через заголовки SOAP, к которым у вас нет доступа - вы не можете передавать информацию аутентификации из Silverlight в WCF по запросу. Предполагая, что вы используете ASP.NET Application Services для выполнения аутентификации пользователя (это единственная из известных мне технологий, которая будет работать здесь), ваша основная стратегия может заключаться в вызове метода ValidateUser, который выполнит вход в систему и даст элементу управления Silverlight команду включите эту информацию о сеансе пользователя в заголовки SOAP, а затем сделайте вызовы службам WCF. Вы можете либо периодически обновлять сеанс, регистрируя пользователя за кулисами, либо ждать сбоя вызова WCF на основе учетных данных, а затем снова проверять пользователя. Я не знаю, есть ли какой-то аспект поддержки вызова служб WCF, который может сделать необходимость повторной аутентификации менее актуальной.

Вы можете хранить логин и пароль пользователя в изолированном хранилище, как это было предложено другим автором, но убедитесь, что уверен, вы сначала зашифруете эти данные, они хранятся в виде обычного текста в неясном месте и небезопасны. 1005 *

0 голосов
/ 21 августа 2009

Хорошо, во-первых, silverlight - это не asp.net, WCF по своему дизайну не имеет состояния, если иное не создано для сохранения состояния.

Тогда, если вы хотите сохранить состояние в silverlight 3, вы можете просто создать статический класс со статическими свойствами и поддерживать эти значения на всех страницах. Но это не элегантное решение. Это возможно, поскольку SL является клиентской средой выполнения, а ваше приложение существует в сборке xap, которая загружается при переходе по URL-адресу, поэтому в основном это похоже на загрузку приложения для рабочего стола Windows и его запуск в ограниченном контексте безопасности. Я не хочу сейчас вдаваться в последствия этого, но важно, чтобы вы знали, что это существует.

Лучший способ решить вашу проблему - использовать IsolatedStorage примерно так

        IsolatedStorageSettings.ApplicationSettings.Remove("UserName");
        IsolatedStorageSettings.ApplicationSettings.Add("UserName", UserName);
        IsolatedStorageSettings.ApplicationSettings.Remove("Password");
        IsolatedStorageSettings.ApplicationSettings.Add("Password", UserPassword);

Таким образом вы можете сохранить данные в настройках приложения и повторно использовать их при следующем запуске приложения. Помните, что все, что хранится в IsolatedStorage, является в основном открытым текстом, доступным только из того же домена / сайта.

Вы должны обезопасить свою службу WCF, используя одну из многих доступных схем безопасности, в противном случае информация SL3, передаваемая службе WCF, будет в открытом тексте и доступна для чтения любому, кто приложит немного усилий, и любой может вызвать вашу службу wcf в обход ваше приложение SL полностью, поэтому не забывайте правильно все защищать.

...