Frage

* *Klarstellung.Anwendung == Standortdefinition.Direkter Datenbankzugriff ist aus dem Fenster ** Ich habe eine Anwendung für SharePoint erstellt, die einige neue Ansätze zum Codieren des Listenzugriffs verwendet.Ich habe die Dinge so strukturiert, dass ich die Dateninteraktion präzise steuern kann.

Zum Beispiel habe ich eine Klasse namens Post, die einige typische Metadaten wie Titel, Zusammenfassung usw. enthält...

In Post befindet sich eine statische Methode namens NewPost , die ein vorformatiertes SPListItem zur Erstellung neuer Posts zurückgibt.

public static SPListItem NewPost(string Title,string Summary)
{
   Posts = CoreLists.Posts();
   var item = Posts.AddItem();
   var item["Alias"] = SPContext.Current.Web.CurrentUser.LoginName;
   return item;
}

Sie werden bemerken, dass ich die SPList durch eine Hilfsklasse namens CoreLists bekomme

public static class CoreLists
{
   public static SPList Posts()
   {
      return SPContext.Current.Web.GetList(SPContext.Current.Web.ServerRelativeUrl + "/lists/Posts");
   }
}

Dies sorgt für einige schöne saubere Datenmethoden.Worauf ich stoße, ist, dass ich keinen anständigen Weg finde, diese Methoden aufzurufen SPSecurity.RunWithElevatedPrivileges

SPSecurity.RunWithElevatedPrivileges wenn ich also versuche, ein neues Listenelement zu erstellen, schlägt es jedes Mal fehl.

Ich mache das, weil ich meine Listen ausgeblendet mache.Ich möchte, dass die Leute nur über die von mir erstellte Benutzeroberfläche auf sie zugreifen.Ich möchte das System weiter vor URL-Hacking schützen, indem ich nur Administratoren erlaube, Elemente zu erstellen, und SecurityBits verwende, um die Elementbearbeitung nur für die Ersteller von Listenelementen zu sperren.

Daher werden alle Listenelemente vom Systemkonto erstellt und haben dann ein Feld namens Alias, mit dem ich das Element einem Benutzer zuordnen kann.

Muss ich meine gesamte Datenzugriffsebene überdenken?Widerspricht die Entscheidung, den Listenzugriff einzuschränken, absolut dem Wunsch nach einer saubereren Datenzugriffsschicht?

War es hilfreich?

Lösung

Sie verwenden SPContext.Current.Web im Inneren des SPSecurity.RunWithElevatedPrivileges delegieren?

Das wird nicht funktionieren.Sachen bekommen mit SPContext gibt Ihnen Objekte, die den Kontext des haben aktuell angemeldeter Benutzer, nicht der erhöhte.Das heißt, wenn Sie einen neuen Listeneintrag mit Objekten erstellen, die von stammen SPContext, werden sie im Sicherheitskontext des aktuell angemeldeten Benutzers erstellt und nicht des erhöhten Benutzers, von dem Sie glauben, dass er sie erstellt.

Wenn Sie Listeneinträge mit sharepoint \ system erstellen möchten, müssen Sie neue SPSite / SPWeb-Objekte in der SPSecurity öffnen.RunWithElevatedPrivileges delegieren und arbeiten stattdessen mit diesen.

Versuchen Sie, dies zu ändern:

   public static SPList Posts() 
   { 
      return SPContext.Current.Web.GetList(SPContext.Current.Web.ServerRelativeUrl + "/lists/Posts"); 
   } 

zu diesem:

   public static SPList Posts() 
   { 
        using( var s = new SPSite(SPContext.Current.Site.ID)
        {
            using( var w = SPSite.OpenWeb(SPContext.Current.Web.ID)
            {
                 var postsList = w.Lists.TryGetList("Posts"); 
                 if( postsList != null )
                      return postsList;
                 else
                    /* do proper error handling */
            }
        }
    }

Jetzt deine Beiträge.AddItem() sollte Listeneinträge mit dem korrekt erhöhten Kontext erstellen.

Lesen Sie mehr über die Erhöhung von Berechtigungen auf MSDN:http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsecurity.runwithelevatedprivileges.aspx

Andere Tipps

Verwenden Sie nicht Rwept.Du brauchst es nicht.

Hidden-Listen erfordern keine spezielle Codierung, um den Zugriff aufzurufen.Wenn der aktuelle Benutzer Berechtigungen auf die Liste hat, rufen Sie einfach auf die verborgene Liste auf, wie Sie eine andere Liste hätten.

Wenn der aktuelle Benutzer keine Berechtigungen auf die Liste aufweist, und Sie möchten das Update per Code proxyieren, sollten Sie das Systemkonto übermitteln.Außerdem sollten Sie kein Objekt über die Sicherheitsgrenzen angeben.Ich schlage vor, das Datenübertragungsobjekt zu erstellen, das Sie in Ihre Datenschicht übergeben.

Vedrans Points RE ui / Sicherheit sind recht richtig - wenn Sie das Sicherheitssystem umschreiben, arbeiten Sie an der Körnung, wie es war. aber Sie möchten möglicherweise immer noch die Sicherheit (und andere SharePoint-Vorteile) nutzen, sodass es nicht vollständig mental ist, um eine App auf SharePoint zu erstellen.

für eine sharepoint-basierte Architektur - Verwenden Sie eine Verlagsstelle.Das gibt Ihnen:

    .
  1. Die Standard-SharePoint-Benutzeroberfläche für Listen usw. - Dies ist die Ansicht des Administrators.
  2. Seitenbibliothek mit separater Masterseite / UI - Dies ist die "Anwendungs-Schnittstelle".

    Standard (alle authentifizierten Benutzer) Get Viewer-Zugriff auf die Site.'admin' Benutzer erhalten mit dem Craftuter / expliziten Berechtigungen, was auch immer.

    punters können nur über benutzerdefinierte Webteile / -code in der Anwendungsschnittstelle auf Standortdaten zugreifen.

Ihr ganzes Konzept ist falsch.

Wenn Sie Ihre eigene Benutzeroberfläche entwickeln, warum verwenden Sie dann SharePoint?Die Verwendung von SQL ist viel sauberer.

Jedes Mal, wenn Sie SPSecurity.RunWithElevatedPrivileges in der Code-SharePoint-Sicherheit verwenden, ist kompromittiert, da Sie aktuellen Benutzer, um als SharePoint \ System zuzulassen, und Zugriff auf alles.

BTW Sie können 'Creator' beim Laufen unter SPSecurity.RunWithElevatedPrivileges einstellen generasacodicetagpre.

Zusatz:

Um weitere Fehlinterpretationen zu vermeiden: Durch die Verwendung von SQL meinte ich keine SharePoint-Datenbank, sondern eine andere andere SQL-Datenbank.Warum?Da Sie benutzerdefinierte UI, benutzerdefinierte Sicherheitsprüfungen verwenden, sind Ihre Liste ausgeblendet (sodass die Benutzer keine SP-OOTB-Funktionen wie Sortierung, Filterung usw. verwenden können.), Suche ist auch keine Option -> Ich sehe keinen Vorteil der Verwendung von SharePointals Datenspeicherung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit sharepoint.stackexchange
scroll top