Настройка навигации для структуры членства - PullRequest
2 голосов
/ 21 февраля 2011

Я занимаюсь разработкой веб-сайта ASP.NET 4.0 с использованием SQL Server 2008 с Membership Framework.Пока он работает нормально со статической навигацией на моей главной странице, которая использует статический файл Web.SiteMap для генерации навигационного меню.Мне интересно, есть ли способ динамически генерировать этот файл в зависимости от роли пользователя или личности.Я также хотел бы знать, существует ли какой-либо способ сохранить этот параметр в базе данных с использованием структуры членства, чтобы мне не приходилось представлять все ссылки для всех пользователей или ролей, которые не имеют права просматривать некоторые страницы на веб-сайте или любых другихспособ создания меню во время выполнения.

Ответы [ 2 ]

1 голос
/ 21 февраля 2011

Усиление безопасности необходимо для обеспечения безопасности, но если вам нужно пойти дальше, чем просто безопасность, подумайте о создании собственного провайдера карты сайта.Больше информации здесь:

HTH.

1 голос
/ 21 февраля 2011

Посмотрите на securityTrimmingEnabled="true", вот несколько ссылок:

В общем, используя этот параметр, вы включаете проверку, разрешено ли роли текущего пользователя посещать текущий узел карты сайта.

Web.config:

<siteMap defaultProvider="MySiteMapProvider" enabled="true">
    <providers>
        <clear />
        <add name="MySiteMapProvider" type="My.XmlSiteMapProvider" siteMapFile="Web.sitemap" securityTrimmingEnabled="true" />
    </providers>
</siteMap>

Web.sitemap:

<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
    <siteMapNode url="Default.aspx" title="Main" roles="*">
        <siteMapNode url="Admin.aspx" title="Admin" roles="admin" />
    </siteMapNode>
</siteMap>

Поставщик нестандартной карты сайта:

namespace My
{
    public class XmlSiteMapProvider : System.Web.XmlSiteMapProvider
    {
        public override bool IsAccessibleToUser(HttpContext context, SiteMapNode node)
        {
            if (node.Roles.OfType<string>().Any(r => String.Equals(r, "*", StringComparison.Ordinal) || context.User.IsInRole(r)))
            {
                return true;
            }
            else
            {
                throw new My.InsufficientRightsException();
            }
        }
    }
}
...