2010-04-17 5 views
5

Ich schreibe eine Website in ASP.NET MVC, die über Benutzerkonten verfügen wird. Da die Seite auf Diskussionen ausgerichtet sein wird, denke ich, dass ich ein System für Administratoren brauche, um Benutzer wie Stack on Overflow in der Lage zu sein, Benutzer zu moderieren. Ich möchte in der Lage sein, einen Benutzer in eine "Suspendierung", so dass sie auf der Website einloggen können (an welcher Stelle werden sie mit einer Nachricht wie "Ihr Konto hat begrüßt wurde bis [DATUM] ") ausgesetzt, aber sind nicht in der Lage, die Funktionen auszuführen, die die Benutzer normalerweise ausführen könnten.Implementieren eines Sperrungs- oder Strafsystems für Benutzer in ASP.NET MVC

Was ist der beste Weg, dies zu implementieren?

Ich dachte daran, eine "Suspended" Rolle zu erstellen, aber die Sache ist, ich habe ein paar verschiedene Rollen für normale Benutzer selbst, mit verschiedenen Privilegien.

Haben Sie schon einmal eine solche Funktion entwickelt? Wie soll ich das machen? Danke im Voraus.

+2

+1 für eine gute Frage und mit kitteh avatar –

+0

unerklärt downvote :( –

+0

+1 Tod downvoters>; - | –

Antwort

2

Lassen Sie mich einen Kommentar in eine Antwort konvertieren und Zach und James Antworten zu vergewaltigen, was ich denke, wäre eine praktikable Lösung ohne die Notwendigkeit, die 'benutzerdefinierte Provider Zone' eingeben. Während das Schreiben von benutzerdefinierten Anbietern ist nicht sehr kompliziert, ist es meine Erfahrung, dass, wenn Sie die eingebauten Anbieter tun können, was Sie wollen, auch wenn es hier oder da einen Geruch erfordert, ist immer der beste Weg.

Fügen Sie eine Rolle hinzu, sagen Sie WellGroomedAndBehavesSelf, die den Zugriff auf Dinge steuert, auf die gut präparierte und benehmte Benutzer Zugriff haben sollten.

Implementieren Sie ein Profil in Ihrer web.config und fügen Sie eine ReinstateDate Eigenschaft hinzu (oder UngroundedOnDate; -D).

Wenn ein Benutzer sich schlecht benimmt, entfernen Sie ihn aus der Rolle WellGroomedAndBehavesSelf und legen Sie die Profileigenschaft ReinstateDate fest.

in Ihrer Login-Logik außer Kraft setzen OnAuthenticate und prüfen, ob eine ReinstateDate Profileigenschaft, falls vorhanden und bestanden, klar, und den Benutzer auf die WellGroomedAndBehavesSelf Rolle hinzuzufügen.

Fertig und keine Notwendigkeit für benutzerdefinierte Anbieter.

UPDATE: Ein alternativer Ansatz, und wahrscheinlich robuster zu verhindern, dass Benutzer immer geerdet werden, wenn irgendwie das Profil an anderer Stelle gelöscht wird als Login-Logik ist für die Rolle zu überprüfen WellGroomedAndBehavesSelf und wenn fehlt, wird dann das Profil prüfen ReinstateDate. Wenn es passiert oder nicht vorhanden ist, setzen Sie den Benutzer zurück in WellGroomedAndBehavesSelf.

Der gleiche Effekt, aber die subtile Änderung in der Logik wird eine robustere Lösung bieten.

Wie Profile implementieren:

Wenn Sie ein Web-Site Projekt suchen here verwenden.

Wenn Sie ein Web verwenden Anwendung Projekt aussehen here.

+0

Ich denke, ich werde diese Lösung tatsächlich verwenden. Könnten Sie den Teil erklären, wo Sie sagen Sie: "Implementieren Sie ein Profil in Ihrer web.config und a dd eine ReinstateDate-Eigenschaft (oder UnergroundedOnDate ;-D) "? Ich bin mir nicht sicher, wie man dem Profil in web.config eine Eigenschaft hinzufügt. Vielen Dank! –

+0

@maxim - aktualisierte Antwort. –

+0

Danke! Ich bin neu in ASP.NET MVC: Wo erstelle ich die Rolle? Wie kann ich das Profil in einer SQL Server-Tabelle konfigurieren? –

2

Ich weiß nicht, wie Ihr Objektmodell aussieht, aber ich würde annehmen, dass jeder Benutzer suspendiert werden könnte.

Edit: Ich habe an eine alternative Lösung gedacht, die wahrscheinlich einfacher ist, wenn man bedenkt, dass Sie die Daten irgendwo serialisieren müssen. Vielleicht könnten Sie ein reguläres DateTime auf Ihrem 'Benutzer' Objekt verwenden, aber es für neue Benutzer auf DateTime.MinValue initialisieren. Wenn Sie einen Benutzer in den Ruhezustand versetzen, setzen Sie suspendedUntil auf die Zeit, bis zu der er gesperrt wurde.

DateTime suspendedUntil = DateTime.MinValue; 

Jedes Mal, wenn Sie überprüfen müssen, um zu sehen, ob ein Benutzer in der Schwebe ist oder nicht, vergleichen, nur suspendedUntil mit DateTime.Now. Wenn suspendedUntil nach DateTime.Now kommt, wissen Sie, dass der Benutzer bis zu dem angegebenen Datum und der angegebenen Uhrzeit gesperrt ist. Andernfalls wird der Benutzer nicht gesperrt. Wenn ein Benutzer nicht mehr in der Lage ist, die Funktion zu deaktivieren, müssen Sie suspendedUntil nicht ändern, da dies nach DateTime.Now erfolgt. es mit DateTime.FromBinary(long)

bool userIsSuspended = suspendedUntil > DateTime.Now; 

Serialisierung der DateTime eine Frage der Rettung der Wert von suspendedUntil.ToBinary() und „Rehydratisierung“ sein würde.

+0

Dies ist eine sehr interessante Lösung: Ich werde. versuchen Sie Ihre und die Lösung von James Westgate morgen –

3

Ich denke Rollen ist der Weg zu gehen, ohne viel Klempnerarbeit Code zu schreiben.

Erstellen Sie eine Rolle mit dem Namen Aktiv, zu der standardmäßig alle Mitglieder gehören. Führen Sie dann Benutzer aus dieser Rolle aus, während sie gesperrt sind.

Jede Aktion, die Sie suspendierten Benutzern verweigern möchten, erfordert die Active Rolle. Einfach.

+0

Halten Sie fest: Benutzer können zu mehr als einer Rolle gleichzeitig gehören, richtig? So, wenn ich mehrere Benutzerrollen habe, wären alle Benutzer immer noch aktiv, und wenn sie suspendiert sind, ' d) Mangel an Active, aber immer noch ihre allgemeinen Rollen –

+0

Das ist die Idee yep. –

+0

Ich werde das versuchen! Scheint wie ein ziemlich geradliniger Plan. –

Verwandte Themen