SimpleMembership убирает аутентификацию пользователя?

Я делаю новый веб-сайт MVC 4 и настроил SimpleMembership. Я также создал CustomPrincipal, который наследуется от RolePrincipal и имеет одно дополнительное свойство с именем UserInfo, которое содержит дополнительную информацию о пользователе, такую ​​как LastName, FirstName и IsActive. Все это хранится в файле cookie через свойство userData FormsAuthenticationTicket.

Мой вопрос заключается в следующем. Предположим, у меня есть страница управления, на которой пользователь-администратор может отключить учетные записи других пользователей — установите для свойства IsActive значение false. Предположим, что в то же время отключаемый пользователь на самом деле в настоящее время вошел в систему. Я не хочу, чтобы этот пользователь мог продолжать перемещаться по сайту, если ему было отказано в правах доступа.

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


person Marko    schedule 09.02.2013    source источник


Ответы (1)


Я бы предложил объединить использование Application_AuthenticateRequest и ASP.NET Cache следующим образом:

1) Когда пользователь удаляется, запишите идентификатор пользователя в кэш ASP.NET, где он может находиться в течение конечного периода времени (возможно, один день):

string cacheKey = "RecentlyDeletedUserId" + userId;
Cache.Add(
    cacheKey,
    true,
    null,
    DateTime.Now.AddDays(1),
    null,
    CacheItemPriority.Normal,
    null
);

2) В global.asax вы можете добавить обработчик Application_AuthenticateRequest, который запускается для каждого запроса после того, как сервер успешно получит билет проверки подлинности с помощью форм. В этом обработчике вы делаете один дешевый запрос кэша в памяти, чтобы узнать, есть ли этот пользователь в списке недавно удаленных пользователей. Если они есть, вы выходите из них и перенаправляете их на страницу входа.

protected void Application_AuthenticateRequest(object sender, EventArgs e) {
    string cacheKey = "RecentlyDeletedUserId" + userId;
    if (Cache[cacheKey] != null)
    {
        FormsAuthentication.SignOut();
        FormsAuthentication.RedirectToLoginPage();
    }
}

Если по какой-то причине вам не нравится подход с перенаправлением, вы можете использовать такой подход:

protected void Application_AuthenticateRequest(object sender, EventArgs e) {
    string cacheKey = "RecentlyDeletedUserId" + userId;
    if (Cache[cacheKey] != null)
    {
        IPrincipal anonymousPrincipal = new GenericPrincipal(new GenericIdentity(String.Empty), null);
        Thread.CurrentPrincipal = anonymousPrincipal;
        HttpContext.Current.User = anonymousPrincipal;
    }     
}

Это просто заменяет пользователя анонимным пользователем, что гарантирует, что пользователь не сможет ничего делать на вашем сайте. (Этот альтернативный подход основан на аннулировании серверной части ASP.NET FormsAuthentication.)

person J.T. Taylor    schedule 10.02.2013
comment
Спасибо за потрясающий ответ. Я думаю, что мне больше нравится идея с кэшем, так как мне придется реализовать метод UserStillValid, и мне не нравится идея запуска бизнес-логики в global.asax. - person Marko; 10.02.2013
comment
Извините, я вырезал и вставил слишком много... !UserStillValid во втором варианте просто проверит кеш - person J.T. Taylor; 10.02.2013
comment
что будет делать второй набор кода? что хранится в файле namedPrincipal. что означает Thread.CurrentPrincipal = anonymousPrincipal and HttpContext.Current.User = anonymousPrincipal; вместо выхода? - person Thomas; 03.09.2015
comment
предположим, что у администратора есть пользовательский интерфейс, из которого администратор делает пользователя неактивным и в то же время пользователя на странице. поэтому, когда Application_AuthenticateRequest сработает? он срабатывает для любого запроса страницы? - person Thomas; 03.09.2015