asp.net - personalizados - ¿Puedo ocultar/mostrar asp: elementos del menú según el rol?
roles y permisos personalizados con asp net mvc (10)
El método SIMPLE puede no ser el mejor para todos los casos
<%
if (Session["Utype"].ToString() == "1")
{
%>
<li><a href="../forms/student.aspx"><i class="fa fa-users"></i><span>STUDENT DETAILS</span></a></li>
<li><a href="../forms/UserManage.aspx"><i class="fa fa-user-plus"></i><span>USER MANAGEMENT</span></a></li>
<%
}
else
{
%>
<li><a href="../forms/Package.aspx"><i class="fa fa-object-group"></i><span>PACKAGE</span></a></li>
<%
}
%>
¿Puedo ocultar ciertos elementos de menú en un asp:Menu
Control de asp:Menu
basado en rol?
<asp:Menu ID="mTopMenu" runat="server" Orientation="Horizontal" />
<Items>
<asp:MenuItem Text="File">
<asp:MenuItem Text="New Project" />
<asp:MenuItem Text="Release Template" NavigateUrl="~/Release/ReleaseTemplate.aspx" />
<asp:MenuItem Text="Release Schedule" NavigateUrl="~/Release/ReleaseSchedule.aspx" />
<asp:MenuItem Text="Roles" NavigateUrl="~/Admin/AdminRoles.aspx" />
</asp:MenuItem>
</Items>
</asp:Menu>
¿Cómo puedo hacer que uno de estos elementos sea visible solo para los usuarios en el rol de administrador? Estoy usando el proveedor de rol asp.net
Esto se hace mejor en el MenuItemDataBound.
protected void NavigationMenu_MenuItemDataBound(object sender, MenuEventArgs e)
{
if (!Page.User.IsInRole("Admin"))
{
if (e.Item.NavigateUrl.Equals("/admin"))
{
if (e.Item.Parent != null)
{
MenuItem menu = e.Item.Parent;
menu.ChildItems.Remove(e.Item);
}
else
{
Menu menu = (Menu)sender;
menu.Items.Remove(e.Item);
}
}
}
}
Debido a que el ejemplo utiliza NavigateUrl, no es específico del idioma y funciona en sitios con mapas de sitio localizados.
Para buscar elementos de menú en la página de contenido basada en roles
protected void Page_Load(object sender, EventArgs e)
{
if (Session["AdminSuccess"] != null)
{
Menu mainMenu = (Menu)Page.Master.FindControl("NavigationMenu");
//you must know the index of items to be removed first
mainMenu.Items.RemoveAt(1);
//or you try to hide menu and list items inside menu with css
// cssclass must be defined in style tag in .aspx page
mainMenu.CssClass = ".hide";
}
}
<style type="text/css">
.hide
{
visibility: hidden;
}
</style>
Para eliminar un elemento de MenuItem
de un menú de NavigationMenu
ASP.net por Value
:
public static void RemoveMenuItemByValue(MenuItemCollection items, String value)
{
MenuItem itemToRemove = null;
//Breadth first, look in the collection
foreach (MenuItem item in items)
{
if (item.Value == value)
{
itemToRemove = item;
break;
}
}
if (itemToRemove != null)
{
items.Remove(itemToRemove);
return;
}
//Search children
foreach (MenuItem item in items)
{
RemoveMenuItemByValue(item.ChildItems, value);
}
}
y extensión auxiliar:
public static RemoveMenuItemByValue(this NavigationMenu menu, String value)
{
RemoveMenuItemByValue(menu.Items, value);
}
y uso de la muestra:
navigationMenu.RemoveMenuItemByValue("UnitTests");
Nota : Cualquier código se libera en el dominio público. No se requiere atribución.
Prefiero usar el método FindItem y usar la ruta del valor para ubicar el artículo. Asegúrese de que su propiedad PathSeparator en el menú coincida con lo que está usando en el parámetro FindItem.
protected void Page_Load(object sender, EventArgs e)
{
// remove manage user accounts menu item for non-admin users.
if (!Page.User.IsInRole("Admin"))
{
MenuItem item = NavigationMenu.FindItem("Users/Manage Accounts");
item.Parent.ChildItems.Remove(item);
}
}
Prueba esto:
protected void Menu1_DataBound(object sender, EventArgs e)
{
recursiveMenuVisit(Menu1.Items);
}
private void recursiveMenuVisit(MenuItemCollection items)
{
MenuItem[] itemsToRemove = new MenuItem[items.Count];
int i = 0;
foreach (MenuItem item in items)
{
if (item.NavigateUrl.Contains("Contact.aspx"))
{
itemsToRemove[i] = item;
i++;
}
else
{
if (item.ChildItems.Count > 0) recursiveMenuVisit(item.ChildItems);
}
}
for(int j=0; j < i; j++)
{
items.Remove(itemsToRemove[j]);
}
}
Puede enlazar los elementos del menú a un mapa del sitio y usar el atributo roles . Necesitará habilitar el recorte de seguridad en su Web.Config para hacer esto. Esta es la forma más sencilla.
Descripción general de la navegación del sitio: http://msdn.microsoft.com/en-us/library/e468hxky.aspx
Información de recorte de seguridad: http://msdn.microsoft.com/en-us/library/ms178428.aspx
Información de enlace de SiteMap: http://www.w3schools.com/aspnet/aspnet_navigation.asp
Buen tutorial / descripción general aquí: http://weblogs.asp.net/jgalloway/archive/2008/01/26/asp-net-menu-and-sitemap-security-trimming-plus-a-trick-for-when-your-menu-and-security-don-t-match-up.aspx
Otra opción que funciona, pero es menos ideal es usar el control de vista de inicio de sesión que puede mostrar los controles según el rol. Esta podría ser la opción más rápida (pero menos flexible / con mejor rendimiento). Puede encontrar una guía aquí: http://weblogs.asp.net/sukumarraju/archive/2010/07/28/role-based-authorization-using-loginview-control.aspx
Puede eliminar elementos de menú no deseados en Page_Load, como esto:
protected void Page_Load(object sender, EventArgs e)
{
if (!Roles.IsUserInRole("Admin"))
{
MenuItemCollection menuItems = mTopMenu.Items;
MenuItem adminItem = new MenuItem();
foreach (MenuItem menuItem in menuItems)
{
if (menuItem.Text == "Roles")
adminItem = menuItem;
}
menuItems.Remove(adminItem);
}
}
Estoy seguro de que hay una forma más ordenada de encontrar el elemento correcto para eliminar, pero esta funciona. También puede agregar todos los elementos de menú deseados en un método de carga de página, en lugar de agregarlos en el marcado.
Solo tienes que eliminar el menú principal en el evento de inicio de página.
Protected Sub navMenu_Init(sender As Object, e As System.EventArgs) Handles navMenu.Init
''Remove the admin menu for the norms
Dim cUser As Boolean = HttpContext.Current.User.IsInRole("Admin")
''If user is not in the Admin role removes the 1st menu at index 0
If cUser = False Then
navMenu.Items.RemoveAt(0)
End If
End Sub
Tengo mi menú en la página principal del sitio. Utilicé la función Page_Load () para que el elemento de menú "Admin" solo sea visible para los usuarios con un rol de administrador.
using System;
using System.Linq;
using Telerik.Web.UI;
using System.Web.Security;
<telerik:RadMenu ID="menu" runat="server" RenderMode="Auto" >
<Items>
<telerik:RadMenuItem Text="Admin" Visible="true" />
</Items>
</telerik:RadMenu>
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
RadMenuItem item = this.menu.FindItemByText("Admin");
if (null != item)
{
if (Roles.IsUserInRole("Admin"))
{
item.Visible = true;
}
else
{
item.Visible = false;
}
}
}
}