Проблемы архитектуры проекта ASP.NET MVC - авторизация и сессия - PullRequest
2 голосов
/ 09 мая 2011

Я заканчиваю проект, который начал другой программист. Изменить всю архитектуру не представляется возможным, но некоторые вещи я хочу перезаписать. А именно - авторизация и способ хранения текущего сеанса пользователя. Проект представляет собой клиента, который общается с сервером через 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 синхронизацию сеансов с сеансом на сервисах? Извините за мой английский, при необходимости уточнения - задавайте вопросы. Спасибо.

1 Ответ

1 голос
/ 09 мая 2011

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

Сказав, что это не всегда возможно, особенно в среде SOA , где сервисный уровень предоставляет услуги сторонним организациям, проводит аудит и т. Д. Фактически мой проект выглядит следующим образом.

Вы не можете избежать сеанса, если вам нужно выдать себя за пользователя на уровне сервиса. InProc сеанс обеспечивает лучшую производительность и SqlServer режим обеспечивает лучшую масштабируемость - решение по компромиссу остается за вами.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...