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

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

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

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

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

Что-то похожее на постоянный объект Session в ASP.NET.


person pencilslate    schedule 20.08.2009    source источник


Ответы (6)


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

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

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

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

person R4cOOn    schedule 28.08.2009
comment
Дело в том, что Silverlight поддерживает только BasicHttpBinding, что не позволяет вам установить режим создания экземпляра Session. - person Phil; 22.09.2010
comment
Вы уверены в этом? Я получаю GUID сеанса на стороне сервера. На самом деле я не пробовал создавать новый экземпляр для каждого сеанса, потому что я выполняю блокировку всех объектов вручную. - person R4cOOn; 24.09.2010

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

person Francois Germain    schedule 31.03.2011

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

это дело...

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

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

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

    • on the server site just do some periodically active session checking. If it is not active anymore, remove it.
  2. По сути, вы должны отправить свой идентификатор сеанса через Интернет, чтобы вызвать все ваши службы, чтобы подтвердить, что вы являетесь аутентифицированным пользователем :)

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

person user974123    schedule 01.10.2011

Хорошо, во-первых, 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. полностью, поэтому не забудьте правильно закрепить все.

person Neil    schedule 21.08.2009
comment
Изолированное хранилище не зашифровано, поэтому защитите эти данные перед сохранением. - person James Cadd; 21.08.2009
comment
Silverlight не поддерживает шифрование RSA для защиты пароля пользователя перед его сохранением в IsolatedStorage. В любом случае, я бы настоятельно не рекомендовал помещать такую ​​информацию (пароли или логины) в изолированное хранилище, поскольку ее можно легко украсть. Даже если вы храните какой-то хэш, считайте, что это значение украдено и применено к другому изолированному хранилищу. - person Denis Vuyka; 09.12.2010

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

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

person James Cadd    schedule 21.08.2009

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

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

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

person Paully    schedule 21.08.2009
comment
Это предполагает, что вы ХОТИТЕ использовать ASP.Net. Это глупое предположение. Хотя основным клиентом может быть Silverlight, могут быть и другие типы клиентов, не являющиеся браузерами. Особенно для автоматизации или импорта/экспорта данных. - person Christopher; 21.01.2010