Подтвердить что ты не робот

Отключение Glimpse на производстве и glimpse.axd

Как я могу ограничить доступ к glimpse.axd при развертывании на производство?

Я использую пользовательскую RuntimePolicy, чтобы гарантировать, что glimpse не включен в производство, но я хочу, чтобы пользователи не попали в axd.

Если мы использовали авторизацию asp.net, то я понимаю, что я могу защитить по пути местоположения в web.config, но эта опция недоступна мне.

Идеи?

4b9b3361

Ответ 1

Glimpse предоставляет несколько различных механизмов настройки безопасности.

Во-первых, как вы упомянули, нужно использовать встроенные функции безопасности ASP.NET. Для этого в web.config вы можете добавить элемент <location>, например:

<location path="glimpse.axd">
  <system.web>
    <authorization>
      <deny users="*"/>
      <allow roles="Admin"/>
    </authorization>
  </system.web>
</location>

и теперь только пользователи из роли администратора смогут получить доступ к Glimpse.axd.

Кстати, путь не должен быть /Glimpse.axd, это только значение по умолчанию. Вы можете переместить местоположение HttpHandler в URL, который известен только вам и вашей команде, внеся несколько изменений в web.config:

<!-- configure system.webServer and/or system.web depending on your ISS configuration -->
<system.webServer>
  <handlers>
    <add name="Glimpse" path="unknownLocation.axd" ... />
  </handlers>
</system.webServer>
<system.web>
  <httpHandlers>
    <add path="unknownLocation.axd" ... />
  </httpHandlers>
</system.web>

<!-- then just configure Glimpse -->
<glimpse defaultRuntimePolicy="On" endpointBaseUri="~/unknownLocation.axd">

Второй подход - создать IRuntimePolicy. Политики времени выполнения могут обеспечить доступ к ресурсам (которые обслуживаются с помощью Glimpse.axd), пока вы возвращаете RuntimeEvent.ExecuteResource из своего свойства ExecuteOn. К сожалению для вас, Glimpse предназначен для игнорирования IRuntimePolicy для запросов к ресурсу по умолчанию (который является Glimpse.axd). Хорошей новостью является то, что вы можете изменить ресурс по умолчанию. Вот как:

  • Создайте или обновите класс, чтобы он реализовал IServiceLocator.
  • Обновите свой web.config, чтобы указать Glimpse на реализацию локатора вашего сервиса.

    <glimpse defaultRuntimePolicy="On" endpointBaseUri="~/Glimpse.axd" serviceLocatorType="YourNamespace.GlimpseLocator, YourAssembly">

  • Теперь Glimpse знает о вашем локаторе и будет запрашивать его для любого типа, который ему нужен, в том числе для ресурса по умолчанию.

  • Внедрить IResource. Я покажу пример того, как создать тот, который просто перенаправляет пользователя на обычную страницу конфигурации (которая больше не является ресурсом по умолчанию), но вы могли бы сделать все, что захотите.
  • Теперь вызовы непосредственно на /Glimpse.axd?n=glimpse_config будут уважать все IRuntimePolicy, которые у вас есть, и звонки в Glimpse.axd перенаправляются туда в любом случае.

Здесь код:

// Create the ServiceLocator that is referenced in web.config
public class GlimpseLocator : IServiceLocator
{
    public T GetInstance<T>() where T : class
    {
        if (typeof(T) == typeof(IResource))
            return new SecurityResource() as T;

        return null;
    }

    public ICollection<T> GetAllInstances<T>() where T : class
    {
        return null;
    }
}

//Implementation of new default resource that just redirects
public class SecurityResource : IResource
{
    public string Name 
    {
        get { return "Security"; }
    }

    public IEnumerable<ResourceParameterMetadata> Parameters 
    {
        get { return Enumerable.Empty<ResourceParameterMetadata>(); }
    }

    public IResourceResult Execute(IResourceContext context)
    {
        return new RedirectResourceResult("/Glimpse.axd?n=glimpse_config");
    }
}

// Your custom runtime policy
public class CustomPolicy : IRuntimePolicy
{
    public RuntimeEvent ExecuteOn 
    {
        get { return RuntimeEvent.ExecuteResource; }
    }

    public RuntimePolicy Execute(IRuntimePolicyContext policyContext)
    {
        //Perform any logic you like and return RuntimePolicy.On or RuntimePolicy.Off
        return RuntimePolicy.Off;
    }
}

Теперь, когда пользователи переходят на Glimpse.axd, они перенаправляются на Glimpse.axd?n=glimpse_config, которые либо отображают стандартную страницу конфигурации, либо политику * Runtime не разрешает выполнение ресурса с именем "glimpse_config". * message - в зависимости от вашего IRuntimePolicy.

Итак, как я уже сказал, прецедент, для которого мы оптимизировали, является первым, чтобы использовать встроенные механизмы безопасности ASP.NET. Glimpse не привязана к этой модели, но вам просто нужно проскочить через несколько обручей, чтобы настроить ATM.

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

Ответ 2

Начиная с Glimpse 1.7.0, они добавили лучший способ защитить Glimpse.axd:

http://blog.getglimpse.com/2013/12/09/protect-glimpse-axd-with-your-custom-runtime-policy/

  • Раскомментируйте код в GlimpseSecurityPolicy.cs(добавлен в ваш проект, когда вы выполните nuget)
  • Измените httpContext.User.IsInRole("Administrator") на любую логику для вас.

N.B. RuntimeEvent.ExecuteResource в ExecuteOn() гарантирует, что эта логика запускается, когда вы запрашиваете Glimpse.axd.

Ответ 3

У меня недостаточно репутации, чтобы комментировать, но я подумал, что нужно было сохранить кого-то из следующей ошибки в тщательном ответе nikmd23:

<location path="glimpse.axd">
  <system.web>
    <authorization>
      <deny users="*"/><------------
      <allow roles="Admin"/>
    </authorization>
  </system.web>
</location>

Стрелка указывает на проблему, которая отрицает *, будет соответствовать всем пользователям, прежде чем авторизация даже даст возможность разрешить роли = "admin". Отмените этот порядок (как показано ниже), чтобы достичь желаемой функциональности.

ссылка: ASP.NET Forms Auth Разрешение доступа к определенному файлу в подкаталоге, когда всем другим должно быть отказано

<location path="glimpse.axd">
  <system.web>
    <authorization>
      <allow roles="Admin"/>
      <deny users="*"/>
    </authorization>
  </system.web>
</location>