禁用生产和glimpse.axd的一瞥

时间:2013-09-11 22:25:57

标签: asp.net-mvc glimpse

如何在部署到生产时限制对glimpse.axd的访问?

我正在使用自定义RuntimePolicy来确保在生产中未启用glimpse但是我想确保用户也不会访问axd。

如果我们使用asp.net的授权,那么我理解我可以通过web.config中的位置路径进行保护,但我无法使用此选项。

想法?

3 个答案:

答案 0 :(得分:13)

Glimpse为安全配置提供了一些不同的机制。

正如您所提到的,第一个是利用ASP.NET的内置安全功能。为此,您可以在web.config中添加<location>元素,如下所示:

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

现在只有 Admin 角色的用户才能访问Glimpse.axd

巧合的是,路径不一定是/Glimpse.axd,这只是一个默认设置。您可以通过对web.config进行一些更改,将HttpHandler的位置移动到您和您的团队只知道的网址:

<!-- 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旨在忽略对{em>默认资源(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,并且呼叫Glimpse.axd仍然会重定向到那里。
  6. 以下是代码:

    // 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并不依赖于那种模式,你只需要通过一些箍来配置它。

    在相关的说明中,我们将在Glimpse 2.0中成为greatly improving the configuration story,目前正在进行中。

答案 1 :(得分: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. httpContext.User.IsInRole("Administrator")更改为与您相关的逻辑
  3. N.B。 RuntimeEvent.ExecuteResource中的ExecuteOn()可确保在您请求Glimpse.axd时运行此逻辑。

答案 2 :(得分:2)

我没有足够的声誉来评论,但我认为有必要在nikmd23的彻底回答中拯救某人以下错误:

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

箭头指向deny *将在授权之前匹配所有用户甚至有机会允许role =“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>