Меню на основе ролей не работает, что я делаю не так?

Вот обзор

  1. Создать членство
  2. Создать роли
  3. Создать файл Sitemap (изменить, чтобы использовать role ="admin")
  4. Создать меню и привязать web.sitemap к меню, используя новый источник данных из смарт-тега меню.
  5. Измените web.config, чтобы включить securityTrimmingEnabled

Это работает так. Если я назначу роль корневому узлу в карте сайта, меню будет правильно скрыто для всех других ролей, кроме ролей, для которых он назначен.

Если я использую роль в одном из подменю, это не работает. У кого-нибудь есть подсказка почему?

Web.sitemap

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode roles="*"> <--------------- Roles Works here
  <siteMapNode title="Home" url="~/Default.aspx" roles="admin"></siteMapNode> <-------- But not here
<siteMapNode title="Videos" url="~/Tags.aspx" />
<siteMapNode title="Student" url="~/MemberList.aspx" roles="student"/>
<siteMapNode title="My Page" url="~/MyPage.aspx" />
<siteMapNode title="My Recent Views" url="~/RecentViews.aspx" />
<siteMapNode title="Upload a Video" url="~/Upload.aspx" />
  <siteMapNode title="Administer Users" url="~/AdministerUsers.aspx" roles="admin">
      <siteMapNode title="Creat user" url="createUser.aspx"></siteMapNode>
  </siteMapNode>
</siteMapNode>
</siteMap>

Файл web.config (модификация)

<siteMap enabled="true">
    <providers>
        <clear/>
        <add siteMapFile="Web.sitemap" name="AspNetXmlSiteMapProvider" type="System.Web.XmlSiteMapProvider" securityTrimmingEnabled="true"/>
    </providers>
</siteMap>

1 ответ

Решение

Вы можете проверить эту ссылку: http://blogs.msdn.com/b/dannychen/archive/2006/03/16/553005.aspx. Функция безопасности ASP.Net является одной из наиболее часто неправильно понимаемых функций.

Основная идея заключается в том, что защитные накладки применяются через <authorization> тег в web.config, а не через роли в карте сайта. Свойство role в карте сайта может только расширить безопасность, но не сузить ее. Например, вот как вы действительно примените правило ролей ученика для ~/MemberList.aspx:

<location path="~/MemberList.aspx">
  <system.web>
    <authorization>
      <allow roles="Student" />
      <deny users="*" />
    </authorization>
  </system.web>
</location>

Это не только приведет к тому, что ссылка исчезнет из вашего меню, но и фактически сделает невозможным посещение страницы кем-то, кто не в роли студента, даже если он введет URL-адрес непосредственно в браузер. Без <authorization> тег, всегда можно будет набрать в URL непосредственно и по-прежнему видеть страницу.

Другие вопросы по тегам