2012-06-22 26 views
12

Ho bisogno di nascondere determinate intestazioni generate da ASP.NET e IIS e restituite nelle risposte da un servizio WebAPI di ASP.NET. Le intestazioni ho bisogno di mascherare sono:Rimozione delle intestazioni dalla risposta

  • Server
  • X-aspnet-Version
  • X-AspNetMvc-Version
  • X-Powered-By

il servizio era in precedenza ospitati in WCF, e il cloaking è stato fatto in un HttpModule sottoscrivendo PreSendRequestHeaders e manipolando HttpContext.Current.Response.Headers. Con ASP.NET WebAPI tutto è ora basato su attività, quindi HttpContext.Current è null. Ho provato a inserire un gestore di messaggi e a manipolare HttpResponseMessage restituito, ma le intestazioni non erano presenti in quella fase. X-Powered-By può essere rimosso nelle impostazioni di IIS, ma qual è il modo suggerito per rimuovere il resto di loro?

risposta

10

Il problema è ognuno viene aggiunto in un punto diverso:

  • Server: aggiunta da IIS. Non esattamente sicuro se può essere disattivato anche se sembra che sia stato necessario rimuoverlo usando HttpModule.
  • X-AspNet-Version: inserito da System.Web.dll al momento della Incasso a HttpResponse classe
  • X-AspNetMvc-Version: Aggiunto da MvcHandler in System.Web.dll. Può essere sovrascritto, quindi questo dovrebbe essere OK.
  • X-Powered-By di IIS ma può essere disattivato come hai detto.

Penso che la soluzione migliore stia ancora utilizzando HttpModules.

+1

Avevi ragione. Sono stato in grado di rimuoverli tutti (incluso il Server) in HttpModule. L'unico problema era come ho ottenuto un riferimento a HttpContext: HttpContext.Current restituisce null, ma HttpApplication.Context sull'istanza HttpApplication passata a HttpModule restituisce un'istanza valida. –

1

Se stai usando IIS7/Azure Dai un'occhiata a questo:

Removing/Hiding/Disabling excessive HTTP response headers in Azure/IIS7 without UrlScan

Esso mostra il modo migliore per disattivare queste intestazioni senza l'utilizzo di HttpModules.

+0

La domanda riguardava la rimozione da un HttpModule personalizzato, non su come rimuoverlo. Ho anche affrontato questo problema e ancora non so come sbarazzarmene. L'utilizzo di UrlScan richiede più tempo e non funziona su Windows Server 2012. –

9

A beneficio di coloro che sbarcano qui, attraverso una ricerca su google/bing :: Ecco il riepilogo delle operazioni:

Fase 1: creare una classe che deriva da IHttpModule (e IDisposable per ripulire quando abbiamo finito):

public class MyCustomModule : IHttpModule, IDisposable 
    { 
     private HttpApplication _httpApplication 
private static readonly List<string> HeadersToCloak = new List<string> 
      { 
       "Server", 
       "X-AspNet-Version", 
       "X-AspNetMvc-Version", 
       "X-Powered-By" 
      }; 
    .. 
    } 

Fase 2: ottenere un riferimento al contesto intrinseco nel metodo IHttpModule.Init, e assegnare un gestore di eventi per l'evento PreSendRequestHeaders:

public void Init(HttpApplication context) 
     { 
      _httpApplication = context; 

      context.PreSendRequestHeaders += OnPreSendRequestHeaders; 
     } 

Fase 3: Ora le intestazioni possono essere rimossi in questo modo:

private void OnPreSendRequestHeaders(object sender, EventArgs e) 
     { 
      if (null == _httpApplication) 
      { 
       return; 
      } 

      if (_httpApplication.Context != null) 
      { 
       var response = _httpApplication.Response; 
       HeadersToCloak.ForEach(header => response.Headers.Remove(header)); 
      } 
     } 

Fase 4: Ora registrare questo modulo nel web.config radice sotto la system.webServer (se in esecuzione IIS 7.0 modalità integrata maggiori dettagli qui):

<configuration> 
    <system.webServer> 
    <modules> 
     <add name="MyCustomModule" type="<namespace>.MyCustomModule "/> 
    </modules> 
    </system.webServer> 
</configuration> 

Spero che questo aiuti!

+0

Questo non elimina l'intestazione 'X-Powered-By'. Almeno non in IIS 7. –

+0

@ Ek0nomik Se si ha accesso alla console di IIS, controllare HttpReponseHeaders (fare doppio clic sull'icona) e rimuovere l'intestazione X-Powered-By da lì. Anch'io ho sperimentato che se un'intestazione di risposta viene aggiunta da IIS, non viene rimossa da HttpModule - appare come l'intestazione di IIS viene aggiunta successivamente nella pipeline. – dotnetguy

Problemi correlati