2017-03-01 9 views
2

ich asp.net benutzerdefinierte Fehler haben und sie arbeiten groß:SSL erforderlich, aber immer noch asp.net benutzerdefinierte Fehler halten

<customErrors mode="RemoteOnly" defaultRedirect="~/Error/Index/500"> 
    <error statusCode="403" redirect="~/Error/Index/403" /> 
    <error statusCode="404" redirect="~/Error/Index/404" /> 
    <error statusCode="500" redirect="~/Error/Index/500" /> 
    <error statusCode="502" redirect="~/Error/Index/502" /> 
    <error statusCode="503" redirect="~/Error/Index/503" /> 
    <error statusCode="504" redirect="~/Error/Index/504" /> 
</customErrors> 

Auch hat das SSL-Zertifikat erfolgreich installiert und meine Seite zugänglich ist einfach gut aus beide http und https.

Das Problem trat auf, als ich eine Anforderung erhielt, SSL zu verlangen. Der http-Link zur Site wurde bereits an 1000 Benutzer verteilt. Daher müssen alle Datenströme, die an die http-Adresse gesendet werden, ordnungsgemäß zur HTTPS-Startseite weitergeleitet werden.

Jede Lösung, die ich versucht habe, um die Umleitung zu erhalten, bricht die benutzerdefinierten Fehler.

Ich habe diese Test-URL, die einen Fehler generiert, um meine benutzerdefinierten Fehlerseiten bei ~/Fehler/Test zu testen. Es zeigt meine benutzerdefinierte Fehlerseite mit dem mvc-Layout.

Egal, wie ich es eingerichtet habe, sobald ich Require SSL innerhalb der SSL-Einstellungen in IIS einschalten, wenn ich http benutzerdefinierte Fehler einschalten (so dass die 403.4 Redirect aktiviert ist), versucht es nicht einmal zeige meine benutzerdefinierte 500 Seite. Es zeigt die generische http 500-Seite.

Ich möchte 403.4 auf http-Ebene mit einer Umleitung behandelt und 500 auf der asp.net-Ebene mit meiner benutzerdefinierten Fehlerseite behandelt werden. Im Übrigen ist das keine Seite, sondern ein Controller, der die .net-Ausnahme verwendet, die in einer Sitzungsvariablen enthalten ist.

Wie kann ich das erreichen?

+0

Wie haben Sie "require ssl" eingeschaltet? Normalerweise ist dies für Cookies usw. erforderlich. Sie müssen einen UrlRewrite ausführen, um Anforderungen an HTTPS zu erzwingen. Dazu ist das auf dem Server installierte UrlRewrite-Modul erforderlich. –

+1

@BenDuguid - Nein, Sie brauchen eine * Umleitung * kein * Umschreiben *. True, das UrlRewrite-Modul könnte das tun. – NightOwl888

+1

Ebenfalls verfügbar ist das RequireHttps-Attribut (das Sie als globaler Filter registrieren können) und die Möglichkeit, HTTP über IIS zu deaktivieren. Es gibt also viele Möglichkeiten, wie Sie "HTTPS" benötigen - wir müssen wissen, welche Sie versucht haben. – NightOwl888

Antwort

0

Das Problem scheint die Trennung zwischen der IIS "SSL erfordert" -Funktion und den vorhandenen Links zu sein - all dies in IIS bewirkt, dass es Anforderungen ablehnt, die nicht über HTTP ausgegeben werden, führt keine Weiterleitungen aus.

403.4 ist ein custom IIS sub-status code, das bedeutet "SSL Required" - wenn Sie die Site ohne SSL anfordern, erhalten Sie diesen Fehler - d. H. Blockiert alle Anfragen, die nicht unter HTTPS ausgegeben werden.

Die tatsächliche Antwort ausgegeben ist ein Standard 403 - verboten, es gibt keine Umleitung beteiligt, noch etwas, um dem Browser zu sagen, dass es die Website über SSL anfordern sollte - das ist alles in der HTML, die zurückgegeben wird, und hoffentlich von der verstanden Benutzer. Der Fehler wird von IIS ausgegeben, bevor die Anforderung zur Verarbeitung an Ihre Anwendung übergeben wird. Aus diesem Grund werden keine benutzerdefinierten Fehler angezeigt. In beiden Fällen ist die 403-Seite immer noch vorhanden .

Sie müssen daher eine Art von Redirect einrichten, wenn Sie Erstanfragen unter HTTP unterstützen müssen.

Es gibt ein paar Möglichkeiten, dies zu tun:

das UrlRewrite Modul verwenden - aber beachten Sie, dass dies ein separate auf Ihrem Hosting-Server abhängig installiert sein kann. Sobald das installiert ist kann man so etwas tun:

<system.webServer> 
    <rewrite> 
     <rules> 
      <rule name="RequireSsl" stopProcessing="true"> 
       <match url="(.*)" /> 
       <conditions> 
        <add input="{HTTPS}" pattern="ON" negate="true" /> 
       </conditions> 
       <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" /> 
      </rule> 
     </rules> 
    </rewrite> 
</system.webServer> 

Dadurch wird sichergestellt, dass alle Anforderungen an den Server (statische Dateien sowie MVC Routen) auf SSL umgeleitet werden.

Eine weitere Option ist das [RequireHttps] Filterattribut, den Controller hinzugefügt werden kann, Aktionen oder die globalen Filter Sammlungen, aber dies wird meist nur MVC Routen beeinflussen - statische Dateien noch ohne HTTPS bedient werden können.

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    [...] 
    // Add RequireHttps to any existing filters to force all routes to SSL 
    filters.Add(new RequireHttpsAttribute()); 
} 

Beachten Sie, dass diese beiden nur ein Client verursachen eine Umleitung auf eine GET-Anforderungen zu erfüllen, werden die meisten Kunden eine 301/302 für POST-Anfragen ignorieren, da Sie kein Formular erneut senden soll.

Die Option [RequireHttps] wird nur eine Weiterleitung für GET-Anfragen ausgeben, POST-Anfragen geben eine Ausnahme für ungültige Aktion zurück: "Muss HTTPS verwenden".

+0

Hier ist ein Link für das Rewrite-Modul: Inklusive Download-Link. https://www.iis.net/learn/extensions/url-rewrite-module/using-the-url-rewrite-module. Es wurde entdeckt bei 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ IIS Extensions \ URL Rewrite' – toddmo

+0

Neugierig, ich habe die Filteroption selbst versucht, da ich nicht sicher war und GET-Anfragen richtig umgeleitet –

+0

Ok. Ich habe 'ERR_CONNECTION_REFUSED' erhalten, wenn der Filter beim Debuggen lokal oder in der Testumgebung verwendet wird. Ich werde nach diesem Problem suchen. Vielen Dank. Klingt wie perfekte Lösung, wenn ich es zur Arbeit bringen kann. – toddmo

Verwandte Themen