Trabajando con Sharepoint: controlando el acceso a páginas del sistema

Buenas a todos.

Hoy os quiero contar como resolví un requisito que me plantearon en uno de los proyectos que he realizado recientemente en Sharepoint 2010 en mi empresa. Con este proyecto, hemos hecho un branding completo del sitio y los usuarios solo pueden navegar a través de las páginas que hemos habilitado. Haciendo un análisis del proyecto, el departamento de seguridad informática detectó que si el usuario en vez de escribir la URL correcta, p.e.: http://misitio/sitepages/pagina1.aspx, por error solo escribía http://misitio/sitepages, SharePoint le redirigía a la página /sitepages/forms/allpages.aspx, además comprobaron que también podían acceder a las URL propias de SharePoint.

Eso permitía ver al usuario lugares del sitio que no se deseaban, y el requisito era evitar que esto se pudiera hacer, y permitir que solo los administradores pudieran hacerlo. Después de intentarlo de varias formas, hice una pregunta en el Blog de Desarrollo de SharePoint en español que recomiendo a todo el mundo y que os enlazo a continuación:

https://social.msdn.microsoft.com/Forums/es-ES/f3d5c716-b592-4630-8c80-796853441fb5/limitar-el-acceso-a-sitepagesformsallpagesaspx?forum=mossdeves

Finalmente opté por la opción de desarrollar un webpart. En el proyecto tengo definida una masterpage para las páginas a las que tiene acceso el usuario, mientras que el resto de páginas (las propias de Sharepoint incluidas) siguen teniendo la masterpage por defecto.

El webpart que definí se inserta en la masterpage por defecto. En dicho webpart se indica, a través de las propiedades, los grupos que no tendrán acceso a la página en cuestión, separados por “;”. Si un usuario intenta acceder a esa página y pertenece a uno de los grupos prohibidos, entonces se hace el redirect a la página inicial, evitando así el acceso a los usuarios, a aquellas partes de SharePoint que no quiero. Os dejo el código del webpart a continuación

public INT_CONTROL_ACCESO WebPartControl { get; set; }

        protected void Page_Load(object sender, EventArgs e)
        {
            this.WebPartControl = this.Parent as INT_CONTROL_ACCESO;

            string avoidListstring = "";

            if (this.WebPartControl.avoidAccess != null)
                avoidListstring = this.WebPartControl.avoidAccess;

            Literal1.Text = "Not Allowed: " + this.WebPartControl.avoidAccess;


            List<string> avoidList = splitAvoidGroupList(avoidListstring);
            List<string> groups = getCurrentUserGroups();

            if (isInAvoidGroup(avoidList, groups))
            {
                Response.Redirect("/");
            }
        }

        private List<string> splitAvoidGroupList(string list)
        {
            List<string> avoidGroup = new List<string>();
            string[] avoidlist = list.Split(';');

            foreach (string item in avoidlist)
            {
                avoidGroup.Add(item);
            }

            return avoidGroup;
        }

        private bool isInAvoidGroup(List<string> avoidGroup, List<string> groups)
        {
            foreach (string item in groups)
                if (avoidGroup.Contains(item)) return true;

            return false;
        }

        private List<string> getCurrentUserGroups()
        {
            List<string> groups = new List<string>();

            foreach (SPGroup group in SPContext.Current.Web.CurrentUser.Groups)
            {
                groups.Add(group.Name);
            }

            return groups;
        }

Como veis el funcionamiento es muy sencillo:

  1. Se obtienen de las propiedades del webpart los grupos prohibidos.
  2. Se buscan los grupos a los que pertenece el usuario que está accediendo.
  3. Se comprueba si dichos grupos están en la lista y en su caso se hace el redirect

La verdad es que desconozco si es la forma más “elegante” de resolver este problema o hay alguna más recomendable. Os animo a que si conocéis alguna forma mejor lo comentéis y lo incluyo en la entrada como solución.

Espero que si se os plantea el mismo requerimiento que a mi, os sea de utilidad.

Saludos.

Anuncios

Problema de visualización de Campos de Metadatos Administrados en listas de Sharepoint

Hola a todos,

os cuento una cosa que hoy me ha tenido entretenido un rato mientras trabajaba en un proyecto basado en Sharepoint 2010. El asunto en cuestión tenía que ver con los campos de metadatos administrados en las listas de mi proyecto.

Mi proyecto a través de un webpart que hemos desarrollado guarda en un elemento en una lista. A través de programación completamos todos los campos, entre ellos el campo de metadatos administrados. La inserción se realizaba correctamente, de hecho en el servidor de pruebas todo funcionaba correctamente, pero al llevarlo al servidor de producción una vez que se hacía la inserción del elemento en la lista, al visualizarlo después, el campo con los metadatos administrados no estaba visible.

Tras investigar un rato me he dado cuenta de que debía ser un problema de permisos, y he empezado a indagar en ello. Ha sido cuando he dado con la “Taxonomy Hidden List”. Esta lista es utilizada por Sharepoint con las siguientes características:

  1. TaxonomyHiddenList es una lista oculta de la colección de sitios que puede ser visualizada directamente a través de la siguiente URL: http://MyWeb.com/Lists/TaxonomyHiddenList
  2. Esta lista contiene todos los términos y palabras clave que son utilizadas en la colección de sitios
  3. Esta lista se usa para cachear términos de la taxonomía y evitar tener que acceder al servicio de metadatos administrados cada vez.

TaxonomyHiddenListItem

Después de buscar un rato he podido encontrar que el problema en la visualización del campo de metadatos de la lista, estaba relacionado con los permisos de acceso a la misma. Para esta lista, se había roto la herencia de permisos y solo los usuarios administradores tenían acceso de lectura/escritura a la misma. Para resolver el problema, si bien, no he reestablecido la herencia de permisos (he leído que por recomendación no es una buena idea hacerlo para esta lista), lo que si he hecho ha sido concederle permisos de lectura a los grupos de usuarios definidos en el proyecto. Una vez modificados los permisos en esta lista, los metadatos se han comenzado a ver correctamente.

A ver si con suerte os ahorro con esto algo de tiempo perdido sin saber exactamente por qué con un problema similar.

Os paso el enlace de donde he sacado la información de la lista en cuestión y donde de paso se menciona también el problema de permisos que os he contado.

http://sharepointtrac.wordpress.com/2013/10/29/taxonomy-hidden-list/

Saludos.