Программный выход пользователя ASP.NET - PullRequest
24 голосов
/ 23 июня 2010

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

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

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

Ответы [ 4 ]

27 голосов
/ 23 июня 2010

Нет способа отказаться от сеанса извне сеанса.Вам придется проверять базу данных при каждой загрузке страницы, и если учетная запись была отключена, то выйдите из системы.Вы также можете добиться этого, используя 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");
        }
    }
}

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

6 голосов
/ 23 июня 2010

При использовании аутентификации по формам:

FormsAuthentication.SignOut();
5 голосов
/ 31 марта 2017

Когда вы выходите из системы, рекомендуется также перезаписать 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();
2 голосов
/ 23 июня 2010

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

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

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

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

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

Не думайте об этом как "я прекращаю их сеанс", думайте об этом как "их сеанс прекращается сам".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...