Pregunta

* *Aclaración.Aplicación == Definición De Sitio.Directa de la Base de datos de access que está fuera de la ventana ** He creado una aplicación para SharePoint que utiliza algunos de los nuevos enfoques para la codificación de la Lista de Acceso.He estructurado cosas de una manera que me permite el control de la interacción de los datos de una manera precisa.

Por ejemplo, yo tengo una clase que se llama Post, que tiene algunos de los metadatos como el Título, Resumen, etc...

Dentro Post es un método estático llamado NewPost que devuelve un pre-formateado artículos splistitem para su uso en la creación de nuevos puestos.

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;
}

Te aviso que estoy consiguiendo la SPList a través de una clase auxiliar llamada CoreLists

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

Esto hace que para algunos limpio agradable de datos métodos.Lo estoy ejecutando en a, es que no puedo encontrar una buena forma de llamar a estos métodos con SPSecurity.RunWithElevatedPrivileges

SPSecurity.RunWithElevatedPrivileges no puede funcionar con una rentabilidad del bloque, de modo que cuando intento crear un nuevo elemento de lista, se produce un error cada vez.

Estoy haciendo esto porque estoy haciendo mis listas ocultas.Quiero que la gente sólo acceder a ellos a través de la interfaz de usuario que estoy creando.Quiero bloquear aún más el sistema de dirección URL de hacking permitiendo que sólo los administradores para crear elementos, y el uso SecurityBits para bloquear el elemento de edición sólo a los creadores de los elementos de la lista.

Por lo tanto, todos los Elementos de la Lista son creados por el Sistema de Cuenta y, a continuación, tienen un campo llamado Alias que me permite coincidir con el elemento a un usuario.

Necesito replantear toda mi Capa de Acceso a Datos?¿La decisión de restringir el Acceso a la Lista de conflicto absolutamente con el deseo de un limpiador de la Capa de Acceso a Datos?

¿Fue útil?

Solución

Utiliza SPContext.Current.Web dentro de la SPSecurity.RunWithElevatedPrivileges delegar?

Que no va a funcionar.Conseguir cosas con SPContext le da a los objetos que tiene el contexto de la usuario que ha iniciado sesión, no la elevación de uno.Eso significa que si usted crea una nueva entrada en la lista de uso de los objetos que proviene de SPContext, que será creado en el contexto de seguridad del usuario que ha iniciado sesión actualmente, y no el de usuario elevados crees que es la creación de ellos.

Si desea crear entradas de la lista de uso de sharepoint\sistema, usted necesita abrir nuevos SPSite/SPWeb los objetos dentro de la SPSecurity.RunWithElevatedPrivileges delegar y trabajar con aquellos en su lugar.

Trate de cambiar esto:

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

a este:

   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 */
            }
        }
    }

Ahora tus entradas.AddItem() debe crear las entradas de la lista con el correctamente elevada contexto.

Lea más acerca de elevación de privilegios en MSDN:http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsecurity.runwithelevatedprivileges.aspx

Otros consejos

No utilice RWEP.Usted no lo necesita.

Listas ocultas no requieren codificación especial para el acceso.Si el usuario actual tiene los permisos a la lista, a continuación, sólo acceder a la lista oculta como lo haría con cualquier otro de la lista.

Si el usuario actual no tiene los permisos a la lista, y usted desea enviar la actualización a través de un código, usted debe suplantar la Cuenta del Sistema.Además, no debe pasar de un objeto a través de los límites de seguridad.Sugiero la creación de transferencia de datos de objeto que se pasa en su capa de datos.

Vedrans puntos de re/IU de Seguridad son bastante correcto - si usted está reescribiendo el sistema de seguridad, está trabajando en contra del grano como fueron. Pero usted podría todavía quieren aprovechar la seguridad (y otros SharePoint beneficios), por lo que no completamente mental para crear una aplicación en SharePoint.

Para más SharePoint basado en la arquitectura de uso de un sitio de publicación.Esto le da a usted:

  1. el estándar de la interfaz de usuario de sharepoint para listas, etc.- este es el admin 'backstage' de la vista.
  2. las páginas de la biblioteca con sala página principal/UI - esta es la "aplicación" de la interfaz.

Por defecto (todos los usuarios autenticados) obtener el visor de acceso al sitio.'admin' a los usuarios a obtener colaborador/permisos explícitos para las listas, lo que sea.

Los jugadores sólo pueden acceder a los datos del sitio a través de elementos web personalizados/código de la interfaz de la aplicación.

Su concepto es erróneo.

Si usted está desarrollando su propia interfaz de usuario y la seguridad, ¿por qué estás usando SharePoint?El uso de SQL es mucho más limpio.

Cada vez que usted use SPSecurity.RunWithElevatedPrivileges en el código de seguridad de Sharepoint está comprometida debido a que usted está permitiendo que el usuario que actúe como SHAREPOINT\Sistema y tener acceso a todo.

Por cierto, puede establecer 'creador' cuando se ejecuta en SPSecurity.RunWithElevatedPrivileges

//First store current user
SPUser currentUser = SPContext.Current.Web.CurrentUser;

SPSecurity.RunWithElevatedPrivileges(delegate 
{
    using (SPSite elevatedSite = new SPSite(SPContext.Current.Site.Url))
    using (SPWeb targetWeb = elevatedSite.OpenWeb(webUrl))
    {
       //Code to get your item or to add a new one

       // Replace 'System Account' with current user
       item["Author"] = currentUser;
       item["Editor"] = currentUser;
       item.SystemUpdate();
    }
});

ADEMÁS:

Para evitar cualquier mala interpretación:mediante el uso de SQL yo no significaba base de datos de SharePoint, pero otro tipo de base de datos SQL.Por qué?Puesto que usted está utilizando una interfaz de usuario personalizada personalizado de controles de seguridad, su lista están ocultos (para que los usuarios no pueden utilizar SP OOTB características tales como la clasificación, filtrado, etc.), la búsqueda es también una opción -> yo realmente no le veo ninguna ventaja de usar SharePoint como almacenamiento de datos.

Licenciado bajo: CC-BY-SA con atribución
scroll top