Remover encabezados HTTP de ASP.NET (X-AspNet-Version, X-AspNetMvc-Version, X-Powered-By)

Cuando publicamos nuestra app web ASP.NET sea webforms, MVC o simplemente un servicio con WEB.API por default las peticiones HTTP viene con unos encabezados que son necesarios removerlos, a veces simplemente para no informar la version que se esta utilizando y prevenir ataques exclusivos a una versión particular de un componente
Estos encabezados son información relacionada al framework, componente MVC, por ejemplo: 

HTTP/1.1 200 OK 
Cache-Control: private 
Content-Length: 10684
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
X-AspNetMvc-Version: 5.1
X-Powered-By: ASP.NET

Como vemos las tres ultimas lineas son los encabezados que están dando información que casi siempre no deseamos.
Entonces ¿como podremos quitar/remover dichos encabezados?

  1. Removiendo encabezado: X-AspNet-Version (en una app especifica… o en todo las app del servidor de producción)
    1. 1. Removiendo en todos los sitios en un servidor de producción
  2. Removiendo encabezado: X-AspNetMvc-Version
  3. Removiendo encabezado del servidor  X-Powered-By
    1. Removiendo por la consola de administracion del IIS
    2. Removiendo mediante el web.config raiz de nuestra app

1) Removiendo encabezado: X-AspNet-Version (en una app especifica… o en todo las app del servidor de producción)

Por default ASP.NET genera un encabezado de versión. Pero por default es siempre esta habilitado… la propiedad enableVersionHeader es true
Aquí podemos ir a la propiedad EnableVersionHeader que habilita la inserción de de la versión de ASP.NET que estamos utilizando. Que lo podemos utilizar desde la seccion httpSection del web.config:

<configuration>    
    <system.web>        
        <httpRuntime enableVersionHeader="false"  />    
    </system.web>
</configuration>

Con esto quitamos (deshabilitamos) el encabezado

X-AspNet-Version: 4.0.30319

1.1: Y... ¿Como hacerlo en todos los sitios del servidor de producción?

Como sabrás existe una jerarquía de archivos de configuración, para modificar este comportamiento en todos los sitios de un servidor tendrías que ir hasta el archivo web.config raíz (que se encuentra en la misma ubicación del machine.config)

Ubicación: C:\Microsoft.NET\Framework\version}\Config
Y agregar en la sección (porque no se encuentra definida) y el atributo.

2) Removiendo encabezado: X-AspNetMvc-Version

Si estamos utilizando ASP.NET MVC, veremos que la app escribe un encabezado similar a la versión de .NET Framework pero indicando que versión de MVC.
Para deshabilitarlo su buscamos en MSDN vemos que es una propiedad DisableMvcResponseHeader (de la clase MvcHandler)

Podemos ver como esta implementado System.Web.Mvc.MvcHandler (que puedes ver el código completo en el repositorio en GitHub) :

namespace System.Web.Mvc {    
    public class  MvcHandler : IHttpAsyncHandler, IHttpHandler, IRequiresSessionState    { 
    ...        
     
        internal static  readonly string  MvcVersion = GetMvcVersionString();
        public static  readonly string  MvcVersionHeaderName = "X-AspNetMvc-Version";         
        ...             
        public static  bool DisableMvcResponseHeader { get; set; }        
        ...        
        protected internal  virtual void  AddVersionHeader(HttpContextBase httpContext){            
            if (!DisableMvcResponseHeader) {
                httpContext.Response.AppendHeader(MvcVersionHeaderName, MvcVersion);
        }        
    }  
    ...   
}}

Podemos ver que simplemente utiliza un condicional con dicha propiedad…  la única forma de no agregar este encabezado es setear esta propiedad estática DisableMvcResponseHeader = true de la clase MvcHandler

Esto lo tendremos que realizar ni bien la app web se inicia, en el evento Application_Start

protected void  Application_Start(){    
     //Removiendo el encabezado HTTP: X-AspNetMvc-Version    
     MvcHandler.DisableMvcResponseHeader = true;
}

NOTA 1: Como esto lo hacemos en el evento de aplicación, todo debe ser con métodos de clase (o estáticos) ya que se ejecuta una única vez al inicio de la app no podremos utilizar instancias de objetos.

NOTA 2: ¿Y si no podemos manipular el código? ¿Por qué no lo tenemos disponible para configurarlo/habilitarlo desde el web.config? Sinceramente es una buena pregunta. Imagínate que no tememos acceso al código, somos simples administradores de website :( ? …. Bueno allí el encabezado se escriba en el response, y tendríamos que manipularlo ya a nivel del IIS (con un modulo post renderizado hecho por nosotros o utilizando algún “(plugins)” en el IIS)

3) Removiendo encabezado: X-Powered-By

Aquí tenemos dos alternativas por el administrador del IIS como así también directamente en el web.config raiz de nuestra app.

3.1) Por el Administrador de IIS en el modulo de “Encabezados de respuesta HTTP”


Y allí quitamos X-Powered-By

3.2) Otra opción es realizándolo directamente en el web.config raíz de nuestra app
Bajo la sección system.webServer > httpProtocol > customHeaders removiendo el nombre del encabezado 

<system.webServer> 
    <httpProtocol> 
      <customHeaders> 
        <remove name="X-Powered-By" /> 
      </customHeaders> 
    </httpProtocol> 
</system.webServer>