July 17, 2010 by Christoff Truter C# ASP.NET
One day Pete the web developer decided to build his friends a website using ASP.net.
He started out by creating a new web solution in his Visual Studio (yes the one he pirated from one of his friends) and added a masterpage to his solution, next he decided to create folders defining all their diverse interests.
Pete felt that navigation is paramount, so he added a sitemap to the website and dropped a menu onto his masterpage where he bound the menu to his sitemap.
<?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode> <siteMapNode url="~/Music/Default.aspx" title="Music" /> <siteMapNode url="~/History/Default.aspx" title="History" /> <siteMapNode title="Sport"> <siteMapNode url="~/Sport/Cricket/Default.aspx" title="Cricket"></siteMapNode> <siteMapNode url="~/Sport/Rugby/Default.aspx" title="Rugby"></siteMapNode> <siteMapNode url="~/Sport/Soccer/Default.aspx" title="Soccer"></siteMapNode> </siteMapNode> </siteMapNode> </siteMap>
<siteMap defaultProvider="XmlSiteMapProvider" enabled="true"> <providers> <clear /> <add name="XmlSiteMapProvider" type="System.Web.XmlSiteMapProvider" siteMapFile="web.sitemap" securityTrimmingEnabled="true" /> </providers> </siteMap> </system.web>
<?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode roles="*"> <siteMapNode url="~/Music/Default.aspx" title="Music" /> <siteMapNode url="~/Fairies/Default.aspx" title="Fairies" roles="Gay" /> <siteMapNode title="Sport" roles="*"> <siteMapNode url="~/Sport/Cricket/Default.aspx" title="Cricket"></siteMapNode> <siteMapNode url="~/Sport/Rugby/Default.aspx" title="Rugby"></siteMapNode> <siteMapNode url="~/Sport/Soccer/Default.aspx" title="Soccer" roles="Gay"></siteMapNode> </siteMapNode> </siteMapNode> </siteMap>
<?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode roles="*"> <siteMapNode url="~/Music/Default.aspx" title="Music" /> <siteMapNode url="~/Fairies/Default.aspx" title="Fairies" /> <siteMapNode title="Sport" roles="*"> <siteMapNode url="~/Sport/Cricket/Default.aspx" title="Cricket"></siteMapNode> <siteMapNode url="~/Sport/Rugby/Default.aspx" title="Rugby"></siteMapNode> <siteMapNode url="~/Sport/Soccer/Default.aspx" title="Soccer"></siteMapNode> </siteMapNode> </siteMapNode> </siteMap>
</system.web> <location path="Sport/Soccer"> <system.web> <authorization> <allow roles="Gay" /> <deny users="*" /> </authorization> </system.web> </location> <location path="Fairies"> <system.web> <authorization> <allow roles="Gay" /> <deny users="*" /> </authorization> </system.web> </location>
using System; using System.Linq; using System.Web; namespace CSTruter.Web { public class SiteMapProvider : XmlSiteMapProvider { public override bool IsAccessibleToUser(HttpContext context, SiteMapNode node) { if (node.Roles.Count == 0) { return base.IsAccessibleToUser(context, node); } else { return (from role in node.Roles.OfType<String>() where context.User.IsInRole(role) || (role == "*") select role).Count() > 0; } } } }
Thanks May 12, 2011 by Chuck Snyder
Thanks for the info. I had discovered the inablility to use the sitemap roles for hiding entries with url's, but had no idea why it wouldn't work. Simple solution, and only 17 entries to do, should only take an hour or so to get it working. Thanks a lot for taking the time to post this. Chuck