2012-06-22 14 views
12

Ich muss bestimmte Header, die von ASP.NET und IIS generiert und in den Antworten von einem ASP.NET-WebAPI-Dienst zurückgegeben werden, verdecken. Die Header Ich brauche zum Tarnen sind:Entfernen von Headern von der Antwort

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

Der Dienst wurde früher gehostet in WCF, und das Cloaking wurde in einem HttpModule durchgeführt, indem PreSendRequestHeaders abonniert und HttpContext.Current.Response.Headers manipuliert wurde. Mit ASP.NET WebAPI ist jetzt alles aufgabenbasiert, also ist HttpContext.Current null. Ich habe versucht, einen Message-Handler einzufügen und die zurückgegebene HttpResponseMessage zu manipulieren, aber die Header waren auf dieser Stufe nicht vorhanden. X-Powered-By kann in den IIS-Einstellungen entfernt werden, aber wie wird der Rest entfernt?

Antwort

10

Das Problem ist, jede ist an einem anderen Punkt hinzugefügt:

  • Server: hinzugefügt von IIS. Nicht genau sicher, ob es ausgeschaltet werden kann, obwohl Sie scheinen, es mit HttpModule zu entfernen.
  • X-AspNet-Version: Hinzugefügt von MvcHandler in System.Web.dll: von System.Web.dll zum Zeitpunkt der Flush in HttpResponse Klasse
  • X-AspNetMvc-Version hinzugefügt. Es kann überschrieben werden, also sollte dieses in Ordnung sein.
  • X-Powered-By von IIS aber kann ausgeschaltet werden, wie Sie sagten.

Ich denke, Ihre beste Wette ist immer noch mit HttpModules.

+1

Sie hatten Recht. Ich konnte sie alle (einschließlich Server) im HttpModule entfernen. Das einzige Problem war, wie ich einen Verweis auf den HttpContext bekam: HttpContext.Current gibt null zurück, aber HttpApplication.Context in der HttpApplication -Instanz, die an das HttpModule übergeben wird, gibt eine gültige Instanz zurück. –

1

Wenn Sie mit IIS7/Azure dann auf dieser einen Blick:

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

Es zeigt den besten Weg, diese Header ohne Httpmodules zu deaktivieren.

+0

Die Frage war, über ein benutzerdefiniertes HttpModule zu entfernen, nicht darüber, wie Sie es entfernen. Ich habe mich auch diesem Problem gestellt und weiß immer noch nicht, wie ich es loswerden soll. Die Verwendung von UrlScan ist zeitaufwendiger und funktioniert nicht unter Windows Server 2012. –

9

Zum Wohle derer, die hier durch eine Google/Bing Suche landen :: Hier ist die Zusammenfassung der Schritte:

Schritt 1: Erstellen Sie eine Klasse, die von IHttpModule (und IDisposable leitet, wenn aufzuräumen wir sind fertig):

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" 
      }; 
    .. 
    } 

Schritt 2: einen Verweis auf den inneren Zusammenhang in der IHttpModule.Init Methode holen und einen Ereignishandler zum PreSendRequestHeaders Ereignisse zuordnen:

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

      context.PreSendRequestHeaders += OnPreSendRequestHeaders; 
     } 

Schritt 3: Jetzt können die Header wie so entfernt werden:

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)); 
      } 
     } 

Schritt 4: nun dieses Modul in Ihrem Root web.config unter dem system.webServer registrieren (falls Lauf IIS 7.0 integrierter Modus mehr Details hier):

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

Hoffe, dass dies hilft!

+0

Das entfernt den Header 'X-Powered-By' nicht. Zumindest nicht in IIS 7. –

+0

@ Ek0nomik Wenn Sie Zugriff auf die IIS-Konsole haben, überprüfen Sie die HttpReponseHeaders (Doppelklick auf das Symbol) und entfernen Sie die X-Powered-By-Header von dort. Ich habe auch erfahren, dass wenn ein Antwort-Header von IIS hinzugefügt wird, wird es nicht durch das HttpModule entfernt - es erscheint, als der Header von IIS später in der Pipeline hinzugefügt wird. – dotnetguy