Меню на основе ролей не работает, что я делаю не так?
Вот обзор
- Создать членство
- Создать роли
- Создать файл Sitemap (изменить, чтобы использовать role ="admin")
- Создать меню и привязать web.sitemap к меню, используя новый источник данных из смарт-тега меню.
- Измените 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 непосредственно и по-прежнему видеть страницу.