如何在部署到生产时限制对glimpse.axd的访问?
我正在使用自定义RuntimePolicy来确保在生产中未启用glimpse但是我想确保用户也不会访问axd。
如果我们使用asp.net的授权,那么我理解我可以通过web.config中的位置路径进行保护,但我无法使用此选项。
想法?
答案 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
。好消息是,您可以更改默认资源。方法如下:
IServiceLocator
。更新您的web.config
,以便瞥见您的服务定位器实施。
<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
,这将显示标准配置页面,或*运行时策略不允许执行名为'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/
httpContext.User.IsInRole("Administrator")
更改为与您相关的逻辑 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>