16

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

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

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

想法?

4

3 回答 3

14

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,这只是一个默认设置。您可以将 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的请求的 's 。好消息是,您可以更改默认资源。就是这样:Glimpse.axd

  1. 创建或更新一个类,以便它实现IServiceLocator.
  2. 更新您web.config的点 Glimpse 到您的服务定位器实现。

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

  3. 现在 Glimpse 知道您的定位器,并会询问它需要的任何类型,包括默认资源。

  4. 实施一个IResource. 我将展示一个示例,说明如何创建一个仅将用户重定向到正常配置页面(不再是默认资源)的示例,但您可以让它做任何您想做的事情。
  5. 现在,直接调用/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'.* 的资源消息 - 取决于您的IRuntimePolicy.

因此,就像我说的,我们优化的用例是第一个利用 ASP.NET 内置安全机制的用例。不过,Glimpse 与该模型无关,您只需跳过几圈即可将其配置为 ATM。

在相关的说明中,我们将极大地改进 Glimpse 2.0 中的配置故事,目前正在进行中。

于 2013-09-12T15:04:40.890 回答
6

自 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")为与您相关的任何逻辑

NB RuntimeEvent.ExecuteResourceinExecuteOn()确保在您请求时运行此逻辑Glimpse.axd

于 2015-10-26T14:13:06.700 回答
3

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

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

箭头指向的问题是,在授权甚至有机会允许角色 =“管理员”之前,拒绝 * 将匹配所有用户。颠倒此顺序(如下所示)以达到所需的功能。

参考: ASP.NET Forms Auth 允许访问子目录中的特定文件,而所有其他文件都应被拒绝

<location path="glimpse.axd">
  <system.web>
    <authorization>
      <allow roles="Admin"/>
      <deny users="*"/>
    </authorization>
  </system.web>
</location>
于 2014-09-24T23:51:46.193 回答