2013-09-11 5 views
13

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

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

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

Идеи?

ответ

13

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). Хорошей новостью является то, что вы можете изменить ресурс по умолчанию. Вот так:

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

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

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

  4. Внесите IResource. Я покажу пример того, как создать тот, который просто перенаправляет пользователя на обычную конфигурационную страницу (которая больше не является ресурсом по умолчанию), но вы могли бы сделать все, что захотите.
  5. Теперь звонки непосредственно /Glimpse.axd?n=glimpse_config будут уважать всеIRuntimePolicy «S вы имеете в месте, и призывает к 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, которые будут либо показать стандартную страницу конфигурации или политики * время выполнения не позволяет выполнение ресурса по имени 'glimpse_config'. * message - в зависимости от вашего IRuntimePolicy.

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

Относительно примечания, мы собираемся быть greatly improving the configuration story в Glimpse 2.0, который в данный момент находится в процессе.

+0

Я смотрю на реализацию второго варианта, который вы указали выше, чтобы иметь пользовательскую RuntimePolicy, но (я уверен, что здесь что-то не хватает). Я не могу получить фактическую страницу редактирования. Метод Execute для CustomPolicy, похоже, не срабатывает. Я правильно перенаправляю n = glimpse_config, а политика «Runtime» не позволяет выполнять ресурс с именем «glimpse_config». » сообщение, но независимо от того, что я ввел в метод Execute, он все еще не отображается. Это что-то мне не хватает? Это точка останова в ExecuteOn. – Arowin

+0

Мы коротко замыкаем оценку политик, как только один говорит, что Glimpse выключен. Зайдите в журнал Glimpse, чтобы узнать, какая политика отключает Glimpse. – nikmd23

+0

Спасибо, Ник. Просто мысль: для меня проще реализовать пользовательский 'HttpModule' и сделать там всю необходимую проверку. – Alex

2

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

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

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

ссылка: ASP.NET Forms Auth Allowing access to specific file in subdirectory when all others should be denied

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

С Glimpse 1.7.0, они добавили лучший способ обеспечить Glimpse.axd:

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

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

N.B. RuntimeEvent.ExecuteResource в ExecuteOn() обеспечивает выполнение этой логики при запросе Glimpse.axd.

Смежные вопросы