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

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

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

<authentication mode="Forms"/>

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

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

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

1 ответ

Решение

Вы уверены, что необходим специальный поставщик ролей? 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>
Другие вопросы по тегам