Создание ролевого меню ASP.NET с использованием элемента управления картой сайта для механизма аутентификации ADFS - PullRequest
1 голос
/ 19 ноября 2011

В настоящее время я использую механизм аутентификации ADFS для аутентификации пользователя.В этом случае я устанавливаю режим аутентификации как None вместо аутентификации форм.После успешного входа пользователя в систему объект заявок предоставит данные роли, связанные с пользователем loggedIn, поэтому в этом случае атрибут ролей карты сайта сможет подобрать роль из объекта заявок.Не могли бы вы объяснить, как будет использоваться свойство securityTrimmingEnabled.

Я использовал пользовательский класс ADFSRoleProvider.cs, который наследует класс RoleProvider и переопределяет метод GetRolesForUser, но метод не вызывается, если я не установил * 1003.*

<authentication mode="Forms"/>

и это, в свою очередь, также не может взаимодействовать с атрибутом ролей, упомянутым в узле siteMapNode.

Основная проблема - после успешного входа пользователя с использованием механизма аутентификации ADFS, какатрибут роли карты сайта знает о роли зарегистрированного пользователя.

Пожалуйста, предоставьте пример кода и помощь по вышеупомянутой проблеме.

1 Ответ

5 голосов
/ 19 ноября 2011

Вы уверены, что необходим специальный поставщик ролей? Объект IClaimsPrincipal предоставляет роли для пользователя, он принимает ваши утверждения типа ClaimTypes.Role.

Возможно, ваша проблема вызвана некоторыми несоответствиями в реализации securityTrimming. Несколько лет назад мне пришлось написать свой собственный поставщик карты сайта, чтобы правильно обрабатывать обрезку.

   public class XmlSiteMapDefaultProvider : XmlSiteMapProvider
   {
    public override bool IsAccessibleToUser( HttpContext context, SiteMapNode node )
    {
        if ( node.Roles.Count > 0 )
        {
            foreach ( string role in node.Roles )
                if ( role == "*" &&
                     context.User != null &&
                     context.User.Identity != null &&
                     context.User.Identity.IsAuthenticated
                     )
                    return true;
                else
                {
                    if ( context.User != null )
                        if ( context.User.IsInRole( role ) )
                            return true;
                }

            return false;
        }

        return true;
    }
}

Просто зарегистрируйте его в web.config в качестве SiteMapProvider:

<siteMap enabled ="true" defaultProvider="XmlSiteMapDefaultProvider">
  <providers>
    <add name="XmlSiteMapDefaultProvider" type="XmlSiteMapDefaultProvider" siteMapFile="Web.sitemap" securityTrimmingEnabled="true" />
  </providers>
</siteMap>
...