В нашем приложении нам нужно, чтобы пользователь "выдал себя за другого". Думайте об этом как об иерархии - Боб выше Фрэнка в иерархии. Боб вошел в систему, и ему нужно некоторое время что-то делать в системе, как Фрэнк. Итак, мы дали Бобу список пользователей, которые сообщают ему, и олицетворенную ссылку. Он нажимает на эту ссылку, и за кулисами я выхожу из Боба и захожу как Фрэнк. Я также установил переменную сессии, которая говорит мне, что на самом деле Боб - это тот парень, который является пользователем. Кроме того, у Боба (теперь он действует как Фрэнк) есть небольшая симпатичная ссылка в верхней части каждой страницы с надписью «Остановить олицетворение».
Кроме того, когда Боб выдает себя за Фрэнка, Бобу запрещено делать какие-то вещи, например, менять пароль Фрэнка.
Это работало замечательно, пока мы не столкнулись с ситуацией, когда, если сессия (я думаю, что я запутался здесь) разрушается (например, когда я копирую новый код и dll на действующий сайт), то когда Боб нажимает на «Остановке олицетворения» он перенаправляется на страницу по умолчанию и по-прежнему регистрируется как Фрэнк, но без переменной сеанса олицетворения. Итак, теперь Боб действительно вошел в систему как Фрэнк и может изменить пароль Фрэнка (помимо всего прочего).
Как получается, что переменная сеанса (Олицетворение) уничтожается, но я думаю, что сеанс все еще висит, потому что он не заставляет пользователя снова войти в систему?
Это довольно серьезная ошибка в том, как работает наша система (ошибка в нашем коде, я уверен, не в .Net). У кого-нибудь есть предложения по решению этой проблемы?
Мы используем ASP.Net c #, службы членства в aspnet, .net 3.5, формы auth ... не знаю, что еще вам нужно знать.
РЕДАКТИРОВАТЬ: Обновленная информация. Похоже, когда «что-то» происходит, например, когда я перекомпилирую некоторые dll и копирую их на веб-сервер, сеанс сбрасывается. Или, скорее, переменные в сеансе сбрасываются. Идентификатор сеанса остается прежним. Я могу проверить Session.IsNewSession, и он возвращает true, даже если идентификатор такой же, как и раньше.
Так же, как упомянул Utaal, Службы Membership отделены от Session, поэтому его токен аутентификации форм все еще находится в браузере, но моя переменная сеанса говорит мне, что на самом деле это не тот пользователь, который контролирует браузер, там больше.
РЕДАКТИРОВАТЬ: Sky, вот что я делаю, чтобы аутентифицировать пользователя. Я не могу понять, куда я вставлю билет в этот поток:
if (Membership.ValidateUser(txtUserName.Text, txtPassword.Text))
FormsAuthentication.SetAuthCookie(txtUserName.Text, false);
Так, где я могу вставить объект билета и установить свою собственную информацию?