Читая http://forums.asp.net/t/975077.aspx/1 Я узнал, что это именно то, что со мной происходит.
Если у узла нет URL-адреса, он ведет себя нормально, но если это так, как у всех моих узлов. Настройки безопасности просто игнорируются.
Я решил свою проблему, прибегнув к более интуитивной реализации карты сайта на основе ролей, скажем:
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);
}
}
Затем единственное изменение, которое я должен был сделать, это добавить звездочку в определение роли корневого уровня.
Как это работает?
Сначала я проверяю, является ли какая-либо из ролей, определенных для этого узла, звёздочкой, если это так, тогда я вижу узел.
Во-вторых, если узел не для всех уровней, я проверяю, указаны ли какие-либо роли и входит ли зарегистрированный пользователь хотя бы в одну из них.
Наконец, я проверяю, есть ли родительский узел, и просто наследую их правило.
Это позволяет обрезке безопасности фактически быть " SECURITY TRIMMING " и не очень хорошо, однако, черт возьми, она должна работать по умолчанию.