el menú basado en roles no funciona, ¿qué estoy haciendo mal?

No puedo entender este.

  • Tengo el siguiente mapa del sitio

    <?xml version="1.0" encoding="utf-8" ?>
    
    <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
        <siteMapNode url="~/" title="Root"  description="Go root">
          <siteMapNode url="~/h" title="Home"  description="Go home" />
    
          <siteMapNode url="~/h/uo" title="Ultima Online" description="Ultima Online">        
            <siteMapNode url="~/h/uo/get" roles="RegisteredUser" title="Get account!" description="Get account!" />
          </siteMapNode>
        </siteMapNode>
    </siteMap>
    
    • Tengo un XmlSiteMapProvider con securityTrimmingEnabled="true", que apunta a este archivo de mapa del sitio.

    • El archivo que quiero recortar tiene un authorization regla en su carpeta web.config

      <configuration>
        <system.web>
          <authorization>
            <deny users="?" />
          </authorization>
        </system.web>
      </configuration>
      
    • No se puede acceder al archivo a través de la URL, si escribo http://localhost/h/uo/get Me redirigen a la página de inicio de sesión.

    • He configurado un <asp:Menu> así en el archivo de la página maestra:

      <asp:SiteMapDataSource ID="MenuSiteMap" ShowStartingNode="false"
                             SiteMapProvider="MenuSiteMapProvider" runat="server" 
      />
      
      <div>
          <asp:Menu ID="NavigationMenu" runat="server" DataSourceID="MenuSiteMap" 
                    CssClass="menu" EnableViewState="false" 
                    IncludeStyleBlock="false" Orientation="Horizontal"
          />
      </div>
      

Sin embargo, cuando se procesa la página, veo el Get account nodo que se supone que debe recortarse cuando ni siquiera estoy conectado, pase lo que pase.

  • ¿Qué estoy haciendo mal?
  • ¿Hay alguna otra forma de crear un menú de navegación del mapa del sitio habilitado para recortes de seguridad?

Estoy usando ASP.NET 4.0 y reescritura de URL con un HttpModule.

preguntado el 27 de agosto de 11 a las 16:08

1 Respuestas

En lectura http://forums.asp.net/t/975077.aspx/1 Descubrí que esto es exactamente lo que me está pasando.

Si el nodo no tiene una URL, se comporta bien, pero si la tiene, como todos mis nodos. El recorte de seguridad simplemente se ignora.

Resolví mi problema recurriendo a una implementación de mapa del sitio basada en roles más intuitiva, para decir:

public class TrimmingXmlSiteMapProvider : XmlSiteMapProvider
{
    public override bool IsAccessibleToUser(HttpContext context, SiteMapNode node)
    {
        if (node.Roles.Cast<string>().Any(r => r == "*"))
            return true;

        if (node.Roles.Count > 0 && node.Roles.Cast<string>().Count(Roles.IsUserInRole) == 0)
            return false;

        return node.ParentNode != null && node.ParentNode.IsAccessibleToUser(context);
    }
}

Luego, el único cambio que tuve que hacer fue agregar un asterisco a la definición de rol del nivel raíz.

¿Cómo funciona esto?

Primero verifico si alguno de los roles definidos para este nodo es un asterisco, si ese es el caso, entonces puedo ver el nodo.

En segundo lugar, si el nodo no es para todos, verifico si hay roles especificados y si el usuario que inició sesión es parte de al menos uno de ellos.

Por último, verifico si hay un nodo principal y simplemente heredo su regla.

Esto permite que el recorte de seguridad sea "RECORTE DE SEGURIDAD"y no bien, sin embargo, se supone que funciona de forma predeterminada.

Respondido 27 ago 11, 21:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.