ASP.NET Проблемы с архитектурой проекта MVC — авторизация и сессия

#asp.net #asp.net-mvc-3 #asp.net-session #asp.net-authorization

#asp.net #asp.net-mvc-3 #asp.net-сессия #asp.net-авторизация

Вопрос:

Я заканчиваю проект, который начал другой программист. Изменить всю архитектуру невозможно, но некоторые вещи я хочу перезаписать. А именно — авторизация и способ хранения текущего сеанса пользователя. Проект представляет собой клиента, который взаимодействует с сервером через soap-сервисы. На сервере есть службы безопасности и несколько других, например, A-service, B-Service. Служба безопасности обеспечивает аутентификацию и сеансовый ключ, с помощью которого инициализируются другие службы. Проект написан на ASP.NET MVC3, глава пользовательской модели, которая реализована как singletone-класс, описывающий методы взаимодействия с сервисами. Как работает авторизация — существует CustomMembershipProvider с переопределенным методом ValidateUser, который работает на службе безопасности. В случае успешной авторизации регистрация пользователя в asp.net — FormsService.Вход в систему (модель.Имя пользователя, false), а затем инициализированный пользовательский класс:

 class SiteUser 
{ 
    public static SiteUser Current 
    { 
        get 
        { 
            if (HttpContext.Current.Session.IsNewSession amp; amp;! 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:

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

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

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

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

Комментарии:

1. Спасибо за ваш совет по сессии, что вы можете сказать об авторизации? Мне не нравится, как это сейчас реализовано — я знаю, что пользователь не авторизуется только при попытке его получить. При этом, если в службе возникает ошибка, я узнаю, что это не сразу

2. Авторизация может осуществляться на уровне сервиса или ASP NET MVC. если это SOA, то должно быть на уровне сервиса. Это сопоставило бы ключ сеанса пользователя с пользователем и проверило, есть ли у него доступ.

3. можете ли вы дать несколько ссылок для чтения о сопоставлении ключа сеанса?

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