Используйте web.sitemap для управления доступом к странице - PullRequest
1 голос
/ 01 апреля 2010

Я настраивал разрешения для страниц на веб-сайте ASP.NET с тегами <location> в web.config, что-то похожее на это:

<location path="Users.aspx">
  <system.web>
    <authorization>
      <allow roles="Administrator"/>
      <deny users="*"/>
    </authorization>
  </system.web>
</location>

Однако у меня также есть карта web.site, которая в основном содержит ту же информацию, то есть какие роли пользователя могут видеть / получать доступ к каким страницам. Фрагмент из моей карты сайта.

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode title="Home">
    ... lots of nodes here ...
    <siteMapNode url="users.aspx" roles="Administrator" title="users" description="Edit users" />
    ...
  </siteMapNode>
</siteMap>

Есть ли какой-нибудь изящный способ использования web.sitemap only для настройки доступа? Теги <location> довольно многословны, и мне не нравится дублировать эту информацию.

Ответы [ 3 ]

1 голос
/ 01 апреля 2010

Возможно, вы ищете SecurityTrimmingEnabled . См. сообщение на форуме и запись в блоге для получения более подробной информации.

То есть Web.config ограничивает доступ от прямой типизации URL и Web.sitemap - от отображаемых URL

0 голосов
/ 30 июня 2010

Вот мой собственный код SiteMapProvider, который выдает исключение, когда пользователь, запрашиваемый страницей (узлом), не имеет права делать это (его роль отсутствует в списке ролей узла)

public class XmlSiteMapProvider : System.Web.XmlSiteMapProvider
{
    public override bool IsAccessibleToUser(HttpContext context, SiteMapNode node)
    {
        var roles = node.Roles.OfType<string>();
        if (roles.Contains("*") || (roles.Count(r => context.User.IsInRole(r)) > 0))
        {
            return true;
        }
        else
        {
            throw new InsufficientRightsException();
        }
    }
}

Для реализации своей собственной логики ролей я также создал собственную RoleProvider.

0 голосов
/ 01 апреля 2010

Конечно, вы можете определить SiteMapProvider в вашем web.config и использовать свойство CurrentNode, чтобы связать SiteMapNode с запрашиваемой страницей.

Сначала объявите вашего провайдера карты сайта (web.config):

<siteMap enabled="true" defaultProvider="DefaultXmlSiteMapProvider">
  <providers>
    <add siteMapFile="Web.sitemap" name="DefaultXmlSiteMapProvider" securityTrimmingEnabled="true" type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
  </providers>
</siteMap>

Пример кода для управления доступом к странице с помощью CurrentNode (вы можете сделать это лучше;)):

bool hasAccess = false;

if (SiteMap.CurrentNode == null)
    throw new ApplicationException("Page not present in SiteMap : " + this.Request.Url.AbsolutePath);

if (SiteMap.CurrentNode.Roles.Count > 0)
{
    // All roles or no roles
    if (SiteMap.CurrentNode.Roles.Contains("*") == true)
    {
        hasAccess = true;
    }
    else
    {
        for (int index = 0; index < SiteMap.CurrentNode.Roles.Count; index++)
        { 
            string role = SiteMap.CurrentNode.Roles[index].ToString();
            hasAccess = HttpContext.Current.User.IsInRole(role);
            if (hasAccess == true)
               break;
        }
    }
}

Примечание. Я добавил роль каждого (*), очень полезную.

...