меню на основе ролей не работает, что я делаю не так? - PullRequest
0 голосов
/ 27 августа 2011

Я не могу понять это.

  • У меня есть следующая карта сайта

    <?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>
    
    • У меня есть XmlSiteMapProvider с securityTrimmingEnabled="true", который указывает на этот файл карты сайта.

    • Файл, который я хочу обрезать, содержит правило authorization в папке web.config

      <configuration>
        <system.web>
          <authorization>
            <deny users="?" />
          </authorization>
        </system.web>
      </configuration>
      
    • Файл не может быть доступен через URL, если я наберу http://localhost/h/uo/get, я буду перенаправлен на страницу входа.

    • Я настроил <asp:Menu> как это в файле главной страницы:

      <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>
      

Тем не менее, когда страница отображается, я вижу узел Get account, который должен быть обрезан, когда я даже не вошел в систему, несмотря ни на что.

  • Что я делаю не так?
  • Есть ли другой способ создать навигационное меню карты сайта с включенной функцией безопасности?

Я использую ASP.NET 4.0 и перезаписываю URL с помощью HttpModule.

1 Ответ

1 голос
/ 27 августа 2011

Читая 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 " и не очень хорошо, однако, черт возьми, она должна работать по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...