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