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

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s