Как улучшить отзывчивость MVC SiteMap Provider при включенной настройке безопасности - PullRequest
0 голосов
/ 11 апреля 2019

Я только что заметил, как отключение безопасности с помощью MVC Sitemap на сайте ASP.NET MVC 5.x может значительно замедлить веб-запросы.

Я собрал из документация , что при включении security trimming провайдер карты сайта MVC создает в экземпляре каждого контроллера в карте сайта, чтобы проверить, должен ли узел быть видимым или нет для текущего пользователя (для каждого веб-запроса).

Я также прочитал , что он кэшируется для каждого веб-запроса, чтобы сохранить воздействие как можно ниже.

Такое поведение обычно оставалось незамеченным для нас, когда большинство зависимостей нашего контроллерагде управлялся как singleton нашей средой IoC (что означает, что получение экземпляра контроллера было очень быстрым).

В последнее время наши требования изменились, и большинство наших зависимостей имеют стиль жизни для каждого веб-запроса, который имел огромныйНегативное влияние на производительность поставщика MVC Sitemap: на наших машинах разработки более 5 секунд (!) для того, чтобы карта сайта mvc сделала свое дело (вstantiate all constructors).

Можно ли что-нибудь сделать, чтобы ускорить процесс, когда включена функция безопасности?

Примечания:

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

Мы также придерживаемся атрибута Authorize по умолчанию, предоставленного Microsoft.

1 Ответ

0 голосов
/ 16 апреля 2019

Это решение, которое я в итоге реализовал:

  1. Отключено усечение безопасности выключено .
  2. Добавлен новый атрибут restrict-to-role в карту сайта MVC (в файле XML) узлы, которые соответствуют действиям контроллера, которые украшены атрибутом [Authorize(Roles="Role1,Role2")].
  3. Добавлен новый поставщик видимости, который проверяет, есть ли атрибут для текущего узла, который имеет restrict-to-rolesприписывать.Если есть значение, я вызываю метод IsInRole удостоверения ASP.NET, чтобы проверить, может ли текущий пользователь видеть узел.
public class RolesInXmlFileSecurityTrimmingVisibilityProvider : SiteMapNodeVisibilityProviderBase
{
    public override bool IsVisible(ISiteMapNode node, IDictionary<string, object> sourceMetadata)
    {
        var isVisible = true;

        if (node.Attributes.ContainsKey("restrict-to-roles"))
        {
            var roles = Convert.ToString(node.Attributes["restrict-to-roles"]);

            if (!string.IsNullOrEmpty(roles))
            {
                 // Your implemenation may vary
                 isVisible = IsInRole(roles);
            }
        }

        return isVisible;
    }
}

Преимущество:

Это оченьбыстро и вам не нужно создавать экземпляры всех контроллеров для поиска атрибута [Authorize].

Недостаток:

Необходимо вручную поддерживать атрибуты restric-to-roles в файле карты сайта MVCповерх MVC [Authorize] в контроллерах.

...