2012-03-26 3 views
0

Ich habe eine Site, die ich portiere, um den Code aufzuräumen und die Dinge zu vereinfachen. Ich benutze die asp-Mitgliedschaft und Profilanbieter, aber ich frage mich, ob ich das richtig für meine Situation mache. Ich bin ziemlich neu in MVC, also möchte ich das in den frühen Stadien richtig machen.Benutzereinschränkungen für zugehörige Daten in ASP-Mitgliedschaft

Benutzer sind Einzelpersonen und sie sind Teil größerer "Institutionen", die sie bei der Registrierung einrichten oder auswählen. In diesem Fall ist die Institution ein Weingut. Ich möchte, dass die Benutzer alle Weine von jedem Weingut sehen können, aber nur diejenigen bearbeiten, die zu ihnen gehören.

Was ist der beste Weg, dies zu tun? Im Moment rendere ich den Link zum Bearbeitungsfeld in meiner Indexansicht basierend auf ihrer Installations-ID und der Hersteller-ID. Ich habe das Gefühl, dass eine Datenanmerkung hier besser funktionieren könnte, aber ich weiß nicht genau, wie ich das für eine Gruppe von Weinen umsetzen soll. Brauche ich mehrere Anbieter? Ich benutze Rollen, um die Bearbeitung einzuschränken, aber im Moment könnte eine Redakteursrolle den Pfad eines anderen Weins manuell eingeben, um ihn zu bearbeiten, wenn dieser Wein nicht zu ihnen gehört.

Alle Hinweise hier wäre super. Ich weiß, dass ich es in den Controller-Methoden machen kann, aber ich suche nach dem "richtigen" Weg, es zu tun. Vielen Dank.

Antwort

2

Ich laufe in das gleiche Problem bei der Arbeit gerade jetzt, und die besten vorgeschlagene Lösung die wir jetzt haben, ist eine „Eigenverantwortung“ Tabelle zu implementieren. Sie können dies nicht mithilfe von Rollen lösen.

Also im Grunde haben Sie einen Eigentümer-ID, im Besitz des Objekts ID und die Art der Objekte ID alle zusammengehalten. Nehmen wir zum Beispiel eine Bearbeitungsanfrage. Wir wissen, dass Sie nur die Daten bearbeiten können, die Person X besitzt. Daher haben wir eine gespeicherte Prozedur, wenn eine Schlüsselkombination in unserer Besitzertabelle vorhanden ist, wobei person.ID = Eigentümer-ID und item.ID = Objekt-ID und item.TypeID = ObjekttypID. Wenn es vorhanden ist, wird es mit der Bearbeitung fortgesetzt, andernfalls wird ein Fehler zurückgegeben.

Sie können dieses Schema verwenden, um Eigentumslisten, Benutzerüberprüfungen und eine Vielzahl anderer Probleme, die Ihnen begegnen, zurückzugeben. Sie werden die ObjectTypeID wahrscheinlich nicht benötigen, wenn nur die Eigentumsrechte eines Typs verfolgt werden. Hoffe das hilft!

+0

ich dies tatsächlich heraus mit einem benutzerdefinierten AuthorizeAttribute. Ich werde es in meiner Antwort veröffentlichen. – user576838

0

Ich habe das herausgefunden, indem ich ein benutzerdefiniertes AuthorizeAttribute auf die Bearbeitungs-, Lösch- und Erstellungsaktionen angewendet habe.

Hier ist, was ich am Ende tun:

public class ProducerEditAttribute : AuthorizeAttribute 
{ 
    private vfContext db = new vfContext(); 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 

     base.OnAuthorization(filterContext); 
     bool bAdmin = filterContext.HttpContext.User.IsInRole("admin"); 
     bool bProdEdit = filterContext.HttpContext.User.IsInRole("producereditor"); 
     bool bProd = filterContext.HttpContext.User.IsInRole("producer"); 

     if (filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      if (bAdmin) 
      { 
       //authorized 
      } 

      if (bProdEdit || bProd) 
      { 
       //check for current wine belonging to the producer. 
       Producer currentProd = db.Producers.Find(Profile.GetProfile(filterContext.HttpContext.User.Identity.Name).InstitutionID); 
       Wine currentWine; 
       object WineID; 
       if (filterContext.RouteData.Values.TryGetValue("id", out WineID)) 
       { 
        currentWine = db.Wines.Find(int.Parse(WineID.ToString())); 
        if (currentProd.Wines.Contains(currentWine) && bProdEdit) 
        { 
         //authorized 
        } 
        else if (bProd) 
        { 
         var result = new ViewResult(); 
         result.ViewName = "Login.cshtml";  //this can be a property you don't have to hard code it 
         result.MasterName = "_Layout.cshtml"; //this can also be a property 
         result.ViewBag.Message = "You do not have permission for add/edit/delete funciontionality. Please request."; 
         filterContext.Result = result; 

        } 
        else 
        { 
         var result = new ViewResult(); 
         result.ViewName = "Login.cshtml"; 
         result.MasterName = "_Layout.cshtml"; 
         filterContext.Result = result; 
        } 
       } 
      } 
      else 
      { 
       var result = new ViewResult(); 
       result.ViewName = "Login.cshtml"; 
       result.MasterName = "_Layout.cshtml"; 
      } 


     } 
    } 
} 
Verwandte Themen