Внедрение системы приостановки или наказания для пользователей в ASP.NET MVC - PullRequest
5 голосов
/ 17 апреля 2010

Я пишу сайт в ASP.NET MVC, который будет иметь учетные записи пользователей. Поскольку сайт будет ориентирован на обсуждение, я думаю, что мне нужна система для администраторов, чтобы иметь возможность модерировать пользователей, как у нас здесь, в Stack Overflow. Я бы хотел иметь возможность поместить пользователя в "приостановку" , чтобы он смог войти в систему на сайт (после чего его приветствует сообщение например, «Ваша учетная запись была приостановлена ​​до [ДАТА]»), но не могут выполнять функции, которые пользователи обычно могли бы выполнять .

Каков наилучший способ реализации этого?

Я думал о создании «приостановленной» роли, но дело в том, что у меня есть несколько разных ролей для обычных пользователей с разными привилегиями.

Вы когда-нибудь проектировали подобную функцию раньше? Как я должен это делать? Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 17 апреля 2010

Я думаю, что роли - это путь без написания большого количества кода.

Создайте роль с именем Активная , членом которой по умолчанию является каждый. Затем выведите пользователей из этой роли, пока они приостановлены.

Каждое действие, которое вы хотите запретить приостановленным пользователям, требует роли Активная . Simples.

2 голосов
/ 20 апреля 2010

Позвольте мне преобразовать комментарий в ответ и изнасиловать ответы Зака ​​и Джеймса, чтобы предоставить то, что, по моему мнению, было бы работоспособным решением без необходимости входа в ' пользовательскую зону провайдера '. Хотя написание пользовательских провайдеров не очень сложно, я считаю, что если вы можете заставить встроенных провайдеров делать то, что вы хотите, даже если это требует запаха здесь или там, это всегда лучший путь.

Добавьте роль, скажем, WellGroomedAndBehavesSelf, которая контролирует доступ к вещам, к которым у пользователей должен быть хороший уход и поведение.

Реализация профиля в вашем файле web.config и добавление свойства ReinstateDate (или UngroundedOnDate ;-D).

Если пользователь плохо себя ведет, удалите его из роли WellGroomedAndBehavesSelf и установите свойство профиля ReinstateDate.

В логике входа в систему переопределите OnAuthenticate и проверьте свойство профиля ReinstateDate, если оно присутствует и передано, очистите его и добавьте пользователя в роль WellGroomedAndBehavesSelf.

Готово и нет необходимости в пользовательских провайдерах.

UPDATE: Альтернативный подход, и, возможно, более надежный, предотвращающий вечное заземление пользователей, если профиль каким-либо образом очищается в другом месте, чем логика входа в систему, заключается в проверке роли WellGroomedAndBehavesSelf, а в случае ее отсутствия ТОГДА проверяет профиль на ReinstateDate. Если он прошел или отсутствует, верните пользователя в WellGroomedAndBehavesSelf.

Тот же эффект, но незначительное изменение в логике обеспечит более надежное решение.

Как реализовать профили:

Если вы используете веб-сайт Сайт проекта, посмотрите здесь .

Если вы используете веб-приложение , проект выглядит здесь .

2 голосов
/ 17 апреля 2010

Я не знаю, как выглядит ваша объектная модель, но я бы предположил, что любой пользователь может быть приостановлен.

Редактировать: Я подумал об альтернативном решении, которое, вероятно, будет проще, если учесть, что вам нужно где-то сериализовать данные. Возможно, вы могли бы использовать обычный DateTime для вашего объекта 'user', но инициализировать его для DateTime.MinValue для новых пользователей. Всякий раз, когда вы помещаете пользователя в «приостановку», установите suspendedUntil на время, которое он приостановил до.

DateTime suspendedUntil = DateTime.MinValue;

Всякий раз, когда вам нужно проверить, находится ли пользователь в отстранении или нет, просто сравните suspendedUntil с DateTime.Now. Если suspendedUntil идет после DateTime.Now, вы знаете, что пользователь приостановлен до указанной даты и времени. В противном случае пользователь не приостанавливается. После того, как пользователь вышел из приостановки, нет необходимости изменять suspendedUntil, так как это будет после DateTime.Now.

bool userIsSuspended = suspendedUntil > DateTime.Now;

Сериализация DateTime будет означать сохранение значения suspendedUntil.ToBinary() и его «регидратацию» с использованием DateTime.FromBinary(long).

...