Службы членства ASP.Net - PullRequest
       16

Службы членства ASP.Net

0 голосов
/ 09 февраля 2010

В нашем приложении нам нужно, чтобы пользователь "выдал себя за другого". Думайте об этом как об иерархии - Боб выше Фрэнка в иерархии. Боб вошел в систему, и ему нужно некоторое время что-то делать в системе, как Фрэнк. Итак, мы дали Бобу список пользователей, которые сообщают ему, и олицетворенную ссылку. Он нажимает на эту ссылку, и за кулисами я выхожу из Боба и захожу как Фрэнк. Я также установил переменную сессии, которая говорит мне, что на самом деле Боб - это тот парень, который является пользователем. Кроме того, у Боба (теперь он действует как Фрэнк) есть небольшая симпатичная ссылка в верхней части каждой страницы с надписью «Остановить олицетворение».

Кроме того, когда Боб выдает себя за Фрэнка, Бобу запрещено делать какие-то вещи, например, менять пароль Фрэнка.

Это работало замечательно, пока мы не столкнулись с ситуацией, когда, если сессия (я думаю, что я запутался здесь) разрушается (например, когда я копирую новый код и 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);

Так, где я могу вставить объект билета и установить свою собственную информацию?

Ответы [ 2 ]

3 голосов
/ 17 февраля 2010

Мэтт, Используйте слот UserData в билете форм для хранения информации о персонификации. Вот для чего это.

Тогда ваша информация не потеряется во время сеанса.

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

2 голосов
/ 09 февраля 2010

Я думаю, что ваша проблема связана с тем фактом, что Аутентификация с помощью форм и Сеанс - это две разные вещи, которые не связаны между собой: они оба (обычно) используют куки, но Аутентификация с помощью форм сохраняет зашифрованного зарегистрированного пользователя непосредственно в куки во время сеанса хранит информацию в процессе (даже если вы можете изменить это поведение) и использует cookie с идентификатором сеанса для ее получения.

Итак, когда ваша информация о сеансе теряется (или сеанс истекает), она на самом деле не остается (кроме недопустимого файла cookie сеанса на компьютере пользователя). С другой стороны, файл cookie проверки подлинности с помощью форм все еще действителен (ASP.NET расшифровывает его и проверяет подлинность пользователя для запроса).

Возможным решением является обнаружение создания нового сеанса (с использованием HttpSessionState.IsNewSession MSDN ) и выход пользователя из системы (с помощью FormsAuthentication). Затем вы можете перенаправить пользователя на страницу входа.

...