Программный выход пользователя ASP.NET
Мое приложение позволяет администратору приостанавливать/отключать учетные записи пользователей. Я делаю это со следующим кодом:
MembershipUser user = Membership.GetUser(Guid.Parse(userId));
user.IsApproved = false;
Membership.UpdateUser(user);
Вышеприведенное действие прекрасно приостанавливает пользователя, но оно не отменяет их сеанс. Следовательно, приостановленный пользователь может оставаться с доступом к приложению, пока сохраняется его cookie-сессия. Любое fix/
Ответы
Ответ 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();