Как выйти из нескольких пользователей Membership, которые не являются текущим пользователем?

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

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

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

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

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

3 ответа

Решение

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

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

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

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

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

Это не сработает...

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

Лучше всего сравнить текущего пользователя с этим массивом в событии Application_AuthenticateRequest и подписать его там:

  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();
                    }
            }       
    }

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

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

Другие вопросы по тегам