viernes, 12 de marzo de 2010

Cómo averiguar si el usuario conectado es Administrador en SharePoint

Aunque hay referencias del tema, son ejemplos incompletos o que no funcionan.  Abajo les describo lo que me funcionó y el cuidado que debe de tener con el código.

Primero lo primero obtener el usuario conectado al sitio a través de SPContext (es decir el contexto actual donde se esta ejecutando tu código).

SPUser usuarioActual = SPContext.Current.Web.CurrentUser;

Luego necesitamos obtener los Roles Asignados al sitio Actual para ello necesitamos la instancia el objeto SPWeb y ejecutar el código con privilegios de administrador para obtenerlo pero los objetos SPWeb obtenidos del contexto no se llevan bien por lo que obtendremos sus ID’s únicamente el GUID y no la referencia en memoria para luego ubicarlos con las siguientes líneas de código:

var IDSitio = SPContext.Current.Site.ID;
var IDWeb = SPContext.Current.Web.ID;

Ahora vamos con el código para obtener el Rol asignado al sitio del usuario:

using (SPSite miSitio = new SPSite(IDSitio))
                          {
                              using(SPWeb miWeb = miSitio.OpenWeb(IDWeb))
                              {
                                  SPRoleAssignment rol = miWeb.RoleAssignments.GetAssignmentByPrincipal(usuarioActual);
                                  if (rol != null)
                                  {
                                      SPRoleDefinitionBindingCollection roleDefBindings = rol.RoleDefinitionBindings;
                                      if (roleDefBindings != null)
                                      {
                                          foreach (SPRoleDefinition item in roleDefBindings)
                                          {
                                              if (item.Type == SPRoleType.Administrator)
                                              {
                                                  esAdministrador = true;
                                                  break;
                                              }
                                          }

                                      }

Si el usuario no tiene permisos específicos sobre este sitio aunque sea administrador de la colección de sitios devolverá falso. Así que para asegurarnos agregamos unas líneas mas:

if (!esAdministrador)
esAdministrador = usuarioActual.IsSiteAdmin;

Y para finalizar la nota curiosa de SharePoint, si el usuario no tiene full control o administrador no puede ejecutar este código y tirará una excepción tan solo la ejecutar esta línea de código:

SPRoleAssignment rol = miWeb.RoleAssignments.GetAssignmentByPrincipal(usuarioActual);

Entonces fuera del using defina un try catch de la siguiente forma:

try{

using….el resto del código

}catch(ArgumentException)
                      {

                          esAdministrador = false;
                      }

Para finalizar solo para optimizar el rendimiento del código utilizar el objeto session para una vez obtenido el valor almacenarlo allí para luego utilizarlo.

if (Session["UsuarioEsAdminsitrador"] == null)

Nota: SPRole esta obsoleto recomendado no utilizarlo, Visual Studio se lo indica inclusive.

Bueno los dejo con el código completo abajo. 

Happy & Secure Coding!,

Manolo Herrera

if (Session["UsuarioEsAdminsitrador"] == null)
            {
                bool esAdministrador = false;
                SPUser usuarioActual = SPContext.Current.Web.CurrentUser;
                var IDSitio = SPContext.Current.Site.ID;
                var IDWeb = SPContext.Current.Web.ID;
                SPSecurity.RunWithElevatedPrivileges(delegate
                  {
                      try
                      {
                          using (SPSite miSitio = new SPSite(IDSitio))
                          {
                              using (SPWeb miWeb = miSitio.OpenWeb(IDWeb))
                              {
                                  SPRoleAssignment rol = miWeb.RoleAssignments.GetAssignmentByPrincipal(usuarioActual);
                                  if (rol != null)
                                  {
                                      SPRoleDefinitionBindingCollection roleDefBindings = rol.RoleDefinitionBindings;
                                      if (roleDefBindings != null)
                                      {
                                          foreach (SPRoleDefinition item in roleDefBindings)
                                          {
                                              if (item.Type == SPRoleType.Administrator)
                                              {
                                                  esAdministrador = true;
                                                  break;
                                              }
                                          }
                                      }
                                      if (!esAdministrador)
                                          esAdministrador = usuarioActual.IsSiteAdmin;
                                  }
                              }
                          }
                      }
                      catch (ArgumentException)
                      {
                          esAdministrador = false;
                      }
                  });
                Session["UsuarioEsAdminsitrador"] = esAdministrador;
            }
            return Convert.ToBoolean(Session["UsuarioEsAdminsitrador"]);
            //Obsoleto
            //SPRoleCollection roles = usuarioActual.Roles;
            //if (roles != null)
            //{
            //    foreach (SPRole rol in roles)
            //    {
            //        if (rol.Type == SPRoleType.Administrator)
            //        {
            //            esAdministrador = true;
            //            break;
            //        }
            //    }
            //}

1 comentario:

Jacob dijo...

Perdón, soy nuevo en esto, necesito saber el usuario con el que se está trabajando para establecer permisos en celdas específicas de un documento de exel, cómo podría realizar esto??