3

Я откатываю свой собственный SiteMapProvider, наследующий System.Web.XmlSiteMapProvider.Как XmlSiteMapProvider проверяет пользователя на заданную роль?

Я хочу, чтобы переопределить логику проверки пользователя, чтобы быть в ролях, указанных в свойстве SiteMapNode в roles:

<siteMapNode url="Add.aspx?type=user" title="Add user" roles="admin" /> 

Как я могу это сделать? Какой член класса выполняет вызов XmlSiteMapProvider, чтобы проверить, что если securityTrimmingEnabled="true"?

ответ

3

abatishchev близко, но не дает четкого указания. База вызовов будет применять правила управления доступом asp.net по умолчанию. Если у вас есть пользовательские правила, просто сделайте свое решение и верните bool.

public override bool IsAccessibleToUser(HttpContext context, SiteMapNode node) 
{ 
    // use the properties of the context and node to determine accessibility. 

    // only call base if you do not want to apply your custom rules 
    // return base.IsAccessibleToUser(context, node); 
} 
+0

Мой вопрос, к сожалению, не привлекал пользователей в течение некоторого времени, поэтому я должен был найти решение самостоятельно и, к счастью, сделал это. Вы не могли бы упомянуть, что я одновременно OP, и один ответ тоже мой. Потому что принятие собственного ответа не приносит никакой репутации, я рад принять ваш :) Спасибо! – abatishchev

+0

@aba - на самом деле, я не заметил, что ОП и ответ были от одного и того же человека, просто чтобы руководство было немного более ясным. Рад, что вы поняли это и рад, что я могу помочь, если да. –

+0

Хорошо, я могу переопределить 'IsAccessibleToUser', чтобы применить собственную логику для проверки. Но как работает * original * 'IsAccessibleToUser'? Отражатели показывают, что он проверяет 'context.User.IsInRole (role)'. Вы знаете, как устанавливать роли в «IPrincipal»? – abatishchev

1
public override bool IsAccessibleToUser(HttpContext context, SiteMapNode node) 
{ 
    var roles = node.Roles; // here it is! 
    return base.IsAccessibleToUser(context, node); 
} 
0

Самого простой, если кто-то хочет ответить на этом, чтобы добавить к вашему web.config

<siteMap defaultProvider="XmlSiteMapProvider" enabled="true"> 
    <providers> 
     <clear/> 
     <add name="XmlSiteMapProvider" 
      description="Default Sitemap Provider" 
      type="System.Web.XmlSiteMapProvider" 
      siteMapFile="Web.sitemap" 
      securityTrimmingEnabled="true"/> 
    </providers> 
    </siteMap> 

то в вашем карте сайта вы можете добавить роли атрибута = «что-то»