Как заставить пользователя выйти из системы, когда его / ее имя изменилось другим пользователем?
В моем приложении я использую Forms-Authentication для входа и выхода пользователей.
Одна функциональность - администратор может изменять имя пользователя других пользователей. В этом случае мне нужно выйти из системы, чье имя пользователя изменилось.
Если я этого не сделаю, из-за своих файлов cookie, установленных ранее, они получат доступ к приложению и получат сообщения об ошибках (так как их имя пользователя не существует, и есть части, где я использую их имя пользователя для некоторых функций).
Как я могу заставить этих пользователей выйти из системы с помощью Forms-Authentication?
ОБНОВИТЬ:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
string controller = filterContext.RouteData.Values["controller"].ToString();
string action = filterContext.RouteData.Values["action"].ToString(); ;
// Below returns the previous username, which does not exist anymore in db.
string userName = HttpContext.Current.User.Identity.Name;
UnitOfWork unitOfWork = new UnitOfWork();
if (!unitOfWork.UserRepository.UserExists(userName))
{
FormsAuthentication.SignOut();
filterContext.HttpContext.Session.Clear();
filterContext.HttpContext.Session.Abandon();
// I am not using Roles.
}
unitOfWork.Dispose();
base.OnActionExecuting(filterContext);
}
В моем глобальном фильтре клиентов я проверяю, существует ли пользователь или нет, если нет, я выхожу из него. Тем не менее, это не работает. Под работой я подразумеваю, что они проходят аутентификацию и получают доступ к приложению.
Заранее спасибо.
2 ответа
Вот что вы делаете, чтобы заставить пользователя выйти из системы:
public void UserPasswordChangedHandler()
{
FormsAuthentication.SignOut();
Roles.DeleteCookie();
Session.Clear();
}
Я не думаю, что построчное объяснение требуется, самоочевидно достаточно. Пожалуйста, дайте мне знать, если я ошибаюсь.
Обновить
Прямой ответ на ваш дополнительный вопрос - сохранить логическое отслеживание для каждого пользователя, если его данные были обновлены администратором, и если да, просто перенаправить его на страницу входа.
Пожалуйста, смотрите следующие статьи для принудительного выхода из системы с использованием информации для проверки подлинности форм:
- Как я могу заставить пользователя выйти
- Как я могу принудительно выйти из всех пользователей для веб-сайта,
- ASP.NET формы аутентификации принудительного выхода из системы
- Как выйти из нескольких пользователей Membership, которые не являются текущим пользователем
Обновление 2
Очистка куки
- Как: создавать и удалять Cookies с ASP.NET MVC
- Как вы очищаете куки в ASP NET MVC 3 и C#
- Как сделать недействительным куки-файл аутентификации
Надеюсь, это поможет вам.
Когда пользователь должен стать недействительным, вы должны добавить его данные во внутренний статический список.
Затем на каждом запросе страницы (возможно, с использованием Application_BeginRequest) проверяйте, есть ли этот текущий пользователь в этом списке, и если да, то вызывать FormsAuthentication.SignOut там и тогда.
Это похоже на взлом, но это лучшее, что я могу придумать прямо сейчас.
Обратите внимание, что удаление состояния сеанса заочного пользователя - это еще одна проблема.