Подтвердить что ты не робот

Программный выход пользователя ASP.NET

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

MembershipUser user = Membership.GetUser(Guid.Parse(userId));
user.IsApproved = false;
Membership.UpdateUser(user);

Вышеприведенное действие прекрасно приостанавливает пользователя, но оно не отменяет их сеанс. Следовательно, приостановленный пользователь может оставаться с доступом к приложению, пока сохраняется его cookie-сессия. Любое fix/

4b9b3361

Ответ 1

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

Например:

public class UserCheckModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.PreRequestHandlerExecute += new EventHandler(OnPreRequestHandlerExecute);
    }

    public void Dispose() {}

    private void OnPreRequestHandlerExecute(object sender, EventArgs e)
    {
        // Get the user (though the method below is probably incorrect)
        // The basic idea is to get the user record using a user key
        // stored in the session (such as the user id).
        MembershipUser user = Membership.GetUser(Guid.Parse(HttpContext.Current.Session["guid"]));

        // Ensure user is valid
        if (!user.IsApproved)
        {
            HttpContext.Current.Session.Abandon();
            FormsAuthentication.SignOut();
            HttpContext.Current.Response.Redirect("~/Login.aspx?AccountDisabled");
        }
    }
}

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

Ответ 2

Если используется проверка подлинности форм:

FormsAuthentication.SignOut();

Ответ 3

На какой-либо общей странице проверьте правильность учетной записи, и если она была отозвана, вызовите Session.Abandon().

Изменить (только заметил, что это все еще открыто.)

Я знаю, что это работает, потому что я это делаю.

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

(окончательный) Редактировать

Не думайте об этом как о "Я завершаю их сеанс", подумайте об этом как о том, что "их сеанс завершается".

Ответ 4

Когда вы выходите из системы, также рекомендуется перезаписать FormsAuthenticationTicket.

HttpContext context = HttpContext.Current;

//overwrite the authentication cookie
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, context.User.Identity.Name, DateTime.Now, DateTime.Now.AddDays(-1), false, Guid.NewGuid().ToString());
string encrypted_ticket = FormsAuthentication.Encrypt(ticket);

HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted_ticket);
cookie.Expires = ticket.Expiration;
context.Response.Cookies.Add(cookie);

//clear all the sessions
context.Session.Abandon();

//sign out and go to the login page
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();