Реализация системы приостановки или штрафа для пользователей в ASP.NET MVC

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

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

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

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

5
задан Maxim Zaslavsky 17 April 2010 в 05:00
поделиться

3 ответа

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

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

Реализуйте профиль в своем web.config и добавьте свойство ReinstateDate (или UngoundedOnDate ;-D).

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

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

Готово, и нет необходимости в настраиваемых провайдерах.

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

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

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

Если вы используете проект Web Site , посмотрите здесь .

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

2
ответ дан 14 December 2019 в 08:46
поделиться

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

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

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

3
ответ дан 14 December 2019 в 08:46
поделиться

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

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

DateTime suspendedUntil = DateTime.MinValue;

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

bool userIsSuspended = suspendedUntil > DateTime.Now;

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

2
ответ дан 14 December 2019 в 08:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: