2011-01-05 1 views
3

Я использую MemberhipProvider, который является частью проекта по умолчанию MVC2.Как отключить несколько MembershipUsers, которые не являются текущим пользователем?

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

foreach(string userName in UserNames) 
{ 
    MembershipProvider MembershipProvider = new MembershipProvider(); 
    MembershipUser membershipUser = MembershipProvider.GetUser(userName, true); 
    Session.Abandon(); 
    FormsAuthentication.SignOut(); 
} 

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

Каков правильный способ сделать это?

+0

Это не сработает ... Сессия.Abandon() будет для текущего HttpContext. Не для каждого пользователя. – turtlepick

ответ

0

Это оказалось не связано столько к MembershipProvider, но к FormsService. Мое окончательное решение оказалось своего рода гибридом двух других ответов, размещенных здесь.

Я закончил создание своего собственного FormsAuthenticationTicket в контроллере учетной записи в действии LogOn. Я генерирую уникальный идентификатор для аутентифицированного сеанса пользователя и сохраняю его в базе данных. Я также добавил идентификатор пользователя к части UserData в билете auth для надежного поиска. По умолчанию билет авторизации содержит только имя пользователя. Затем FormsAuthenticationTicket сохраняется в файле cookie при успешном входе в систему.

В основном все это заменило FormsService.SignIn (model.UserName, model.RememberMe);

Я также добавил public void Application_ReleaseRequestState (отправитель объекта, EventArgs args) в Global.asax. Я не уверен, что это рассматривается как расширение функции или что, поскольку она не выглядит переопределенной. Внутри Application_ReleaseRequestState он получает форму FormsAuthenticationTicket пользователя из файла cookie. Затем он расшифровывает аутентификационный билет и получает пользовательский идентификатор пользователя из части UserData билета. Затем он запрашивает базу данных, если билет авторизации по-прежнему действителен. Если билет недействителен, он устанавливает срок действия cookie пользователя.

Чтобы заставить пользователей выйти из системы, я могу либо изменить даты истечения срока их действия в базе данных, либо переключить бит отключения для своих билетов на авторизацию в базе данных. В любом случае, когда Application_ReleaseRequestState запрашивает базу данных, если их авторизационные билеты действительны, их не будет. Таким образом, их файлы cookie будут устаревать после следующей страницы, на которую пользователь ударил после этой проверки.

1

I Не использовал поставщика членства, когда я это сделал, но в основном я сохранил SessionId, Username и lastPage, посещенные в базе данных, когда пользователь вошел в систему. Затем каждая страница использовала текущий SessionID, чтобы получить имя пользователя и сделать связанное с ним имя пользователя, например баланс отображения для текущего пользователя и т. Д., Если у пользователя нет действительного пользователя, а затем вернуться на страницу входа.

Это позволило мне увидеть, как пользователи продвигаются через веб-сайт и вручную отключают кого бы то ни было, и дали мне Single Signon для каждого пользователя. Был также куча очистке кода в global.asx странице

+0

Я понимаю, как это сделать, но мне очень хотелось бы знать, как это сделать, используя MemberhipProvider. Спасибо за предложение. – Sgraffite

2

Это не будет работать ...

Session.Abandon() будет для текущей HttpContext. Не для каждого пользователя, как вы пытаетесь сделать. То же самое для FormsAuthentication.SignOut().

Лучше всего проверить текущий пользователь против этого массива в Application_AuthenticateRequest Event и подписать их там:

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
    { 
      if (User.Identity.IsAuthenticated) 
      { 
       //add your ckeck here 

       if (Usernames.Contains(User.Identity.Name)) 
        { 
         Session.Abandon(); 
         FormsAuthentication.SignOut(); 
        } 
      }  
    } 
+0

Мне удалось заставить это выходить из системы, когда я жестко закодировал их имена, однако я не могу не думать, что это странное место, чтобы поместить это. Мне нужно каким-то образом загрузить имена пользователей, которые я хочу найти там. Который, вероятно, будет означать вызов базы данных каждый раз при вызове метода. – Sgraffite

+0

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

+0

Дело в том, что каждый запрос проходит через HttpContext, а один из модулей, который он обрабатывает, - это «SessionModule». В этот момент вы можете только прочитать сеанс этого реквестера. Даже делая «количество открытых сеансов», вам нужна специальная логика и просмотр событий сеанса. – turtlepick