2014-12-22 11 views
7

Wir arbeiten derzeit an einer kleineren ASP.NET MVC 5-Anwendung, die ASP.NET Identity verwendet. Es ermöglicht uns, verschiedene Projekte und ihre Aufgaben zu pflegen. Wir haben kürzlich die Basis-Authentifizierung implementiert, so dass wir einen Benutzer bei unserer Website registrieren und sich mit ihnen anmelden können.Implementierungsrechte mit ASP.NET Identity

Wir möchten Zugriffsrechte auf Projektbasis verwalten können, so dass wir für jeden einzelnen Benutzer sagen können, dass er für ein bestimmtes Projekt Lese-, Schreib-, Admin- oder keine Berechtigungen hat.

Mein erster Gedanke war, dass wir eine einfache neue Tabelle in unserer Datenbank erstellen können, die die Benutzerrechte speichert. Aber ich denke, dass es eine integrierte Möglichkeit geben könnte, dies mit ASP.NET Identity zu erreichen.

Also meine Frage ist wirklich, welchen Weg sollten wir folgen - manuell eine neue Tabelle zu erstellen, um die Rechte zu verwalten oder verwenden Sie etwas eingebaut von ASP.NET Identity.

+0

Vielleicht wird dieser Artikel Ihnen helfen, eine Entscheidung zu treffen: http://brockallen.com/2013/10/20/the-good-the-bad-and-the-ugly-of-asp-net-identity/ –

+0

Thier ist kein Konzept von Benutzerrechten in asp.net Identität gebaut, da sie ein sehr anwendungsspezifisches Konzept sind. Es gibt ein Konzept von Benutzerrollen, das nur eine logische Gruppierung von Benutzern darstellt. Normalerweise wenden Sie eine bestimmte Benutzerschreibweise auf eine Rolle an. –

+0

Wenn ich Sie richtig verstehe, würden Sie vorschlagen, für jedes Projekt eine Rolle für jede Zugriffsbeschränkung (lesen/schreiben/admin) zu erstellen? – Thorakas

Antwort

3

Gebrauch etwas built-in von ASP.NET Identität versehen

Die einzigen Dinge, die Sie sind Ansprüche oder Rollen verwenden könnten und beide sind für das, was Sie wollen IMO nicht gebaut.

So würde ich mit Ihrem eigenen Tisch gehen, die das Projekt zu einem Benutzer verbindet, z.B .:

public class UserProjectRights 
{ 
    [Key] 
    public ApplicationUser User { get; set; } 
    [Key] 
    public Project Project { get; set; } 

    public AccessRight Right { get; set; } 
} 

Dann, wenn Sie einige Aktionen zu tun, wo ein spezifisches Recht vor, Sie das überprüfen, müssen erforderlich ist. Es gibt mehrere Möglichkeiten, wie Sie das tun können. In meiner app habe ich „richtige Check-Erweiterungen zugreifen“ wie folgt aus (ich habe eine gemeinsame Schnittstelle für all „Zugriffsrecht entities“ definiert „Wiederverwendung“ diese Methode):

public static bool? CanView(this ApplicationUser user, Project project) 
{ 
    var userRight = project.Rights.FirstOrDefault(r => r.User == user); 
    return userRight == null ? (bool?)null : userRight.Right.HasFlag(AccessRight.View); 
} 

vorausgesetzt AccessRight ist eine Enumeration wie:

[Flags] 
public enum AccessRight 
{ 
    View, 
    Edit, 
    Admin 
} 

Dann können Sie so etwas wie die folgenden in Ihrer Logik tun:

if (user.CanView(project) == true) 
{ 
    // show project 
} 

I verwendet bool? so kann ich verschiedene implementieren „Defau lt Verhalten "wie ich weiß, wenn null zurückgegeben wird, ist kein Recht definiert.

+0

Und dann in jedem Controller, der etwas mit einem Projekt oder projektbezogenen Entität tut, müssen Sie überprüfen, ob der Benutzer das entsprechende Recht auf das gegebene (übergeordnete) Projekt hat. – CodeCaster

+0

'Die einzigen Dinge, die Sie dort verwenden können, sind Ansprüche oder Rollen und beide sind nicht für das, was Sie wollen, IMO' erstellt - ich habe ziemlich glücklich Behauptungen zuvor verwendet, um" Rolle im Projekt "Verhalten wie OP beschreibt. – Rawling

+1

@ChrFin letzteres. Sie sind nicht ganz da, indem Sie einfach eine Tabelle erstellen. Nicht, dass es in Ihrer Antwort erforderlich ist, aber OP und zukünftige Besucher könnten verwirrt sein. – CodeCaster