Я заканчиваю проект, который начал другой программист. Изменить всю архитектуру не представляется возможным, но некоторые вещи я хочу перезаписать. А именно - авторизация и способ хранения текущего сеанса пользователя.
Проект представляет собой клиента, который общается с сервером через soap-сервисы. На сервере есть Security-Services и несколько других, например, A-service, B-Service.
Служба безопасности обеспечивает аутентификацию и сеансовый ключ, с помощью которого инициализируются другие службы.
Проект написан на ASP.NET MVC3, главе пользовательской модели, которая реализована в виде синглет-класса, который описывает методы взаимодействия со службами.
Как работает авторизация - есть CustomMembershipProvider с переопределенным методом ValidateUser, который работает на Security-service. В случае успешной авторизации, регистрация пользователя в asp.net - FormsService.SignIn (model.UserName, false) и затем инициализируемый класс пользователя:
class SiteUser
{
public static SiteUser Current
{
get
{
if (HttpContext.Current.Session.IsNewSession & &! HttpContext.Current.User.Identity.IsAuthenticated)
{
throw new UserAutorizationExeption () {Reason = AuthExceptionReason.NewSession};
}
if (HttpContext.Current.Session [sessionKey] == null)
{
FormsAuthentication.SignOut ();
throw new UserAutorizationExeption () {Reason = AuthExceptionReason.ServerSessionExpired};
}
return HttpContext.Current.Session [sessionKey] as W1User;
}
set
{
if (HttpContext.Current.Session! = null)
{
HttpContext.Current.Session [sessionKey] = value;
}
}
}
public SiteUser ()
{
}
public static SiteUser Create ()
{
SiteUser.Current = new SiteUser ();
return SiteUser.Current;
}
/ / Web-services methods go here
}
Основная проблема в том, что теперь сеанс хранится в памяти:
web.config:
<sessionState mode="InProc" timeout="20" />
Установить SqlServer-mode проблематично, поскольку будет трудно сериализовать SiteUser. Как я могу обойти это?
И есть проблемы с авторизацией - как правильно сделать Asp.Net синхронизацию сеансов с сеансом на сервисах?
Извините за мой английский, при необходимости уточнения - задавайте вопросы. Спасибо.