Ich möchte das RequireHttpsAttribute verwenden , um zu verhindern, dass ungesicherte HTTP-Anforderungen an eine Aktionsmethode gesendet werden.
C #
[RequireHttps] //apply to all actions in controller
public class SomeController
{
[RequireHttps] //apply to this action only
public ActionResult SomeAction()
{
...
}
}
VB
<RequireHttps()> _
Public Class SomeController
<RequireHttps()> _
Public Function SomeAction() As ActionResult
...
End Function
End Class
Leider unterstützt ASP.NET Development Server HTTPS nicht.
Wie kann ich meine ASP.NET MVC-Anwendung dazu bringen, RequireHttps zu verwenden, wenn sie in der Produktionsumgebung veröffentlicht wird, aber nicht, wenn sie auf meiner Entwicklungsarbeitsstation auf dem ASP.NET Development Server ausgeführt wird?
asp.net-mvc
visual-studio
ssl
https
Zack Peterson
quelle
quelle
Antworten:
Dies hilft nicht, wenn Sie Release-Builds auf Ihrer Entwicklungsarbeitsstation ausführen, aber die bedingte Kompilierung könnte den Job erledigen ...
Aktualisieren
In Visual Basic sind Attribute technisch Teil derselben Zeile wie die Definition, für die sie gelten. Sie können keine bedingten Kompilierungsanweisungen in eine Zeile einfügen, daher müssen Sie die Funktionsdeklaration zweimal schreiben - einmal mit dem Attribut und einmal ohne. Es funktioniert jedoch, wenn Ihnen die Hässlichkeit nichts ausmacht.
Update 2
Einige Leute haben erwähnt, dass sie
RequireHttpsAttribute
ohne Beispiel stammen, also hier eines für Sie. Ich denke, dass dieser Ansatz viel sauberer wäre als der Ansatz der bedingten Kompilierung, und es wäre meine Präferenz in Ihrer Position.HAFTUNGSAUSSCHLUSS: Ich habe diesen Code nicht einmal ein bisschen getestet und mein VB ist ziemlich verrostet. Ich weiß nur, dass es kompiliert. Ich schrieb es basierend auf den Vorschlägen von spot, Queen3 und Lance Fisher. Wenn es nicht funktioniert, sollte es zumindest die allgemeine Idee vermitteln und Ihnen einen Ausgangspunkt geben.
Grundsätzlich wird das neue Attribut nur beendet, anstatt den Standard-SSL-Autorisierungscode auszuführen, wenn die aktuelle Anforderung lokal ist (dh Sie greifen über localhost auf die Site zu). Sie können es so verwenden:
Viel sauberer! Vorausgesetzt, mein nicht getesteter Code funktioniert tatsächlich.
quelle
Wenn jemand die C # -Version benötigt:
quelle
filters.Add(new MyRequireHttpsAttribute ());
inFilterConfig
?Das Ableiten von RequireHttps ist ein guter Ansatz.
Um das Problem vollständig zu umgehen, können Sie IIS auf Ihrem lokalen Computer auch mit einem selbstsignierten Zertifikat verwenden. IIS ist schneller als der integrierte Webserver, und Sie haben den Vorteil, dass Ihre Entwicklungsumgebung eher der Produktion ähnelt.
Scott Hanselman verfügt über eine hervorragende Ressource für einige Möglichkeiten zur Implementierung von lokalem HTTPS mit VS2010 und IIS Express.
quelle
Ich gehe davon aus, dass Sie das MVC-Filtersystem und Global.asax.cs nutzen können ...
quelle
Da es der ASP.Net Development Server war, der Ihr Problem in erster Linie verursacht hat, ist es erwähnenswert, dass Microsoft jetzt über IIS Express verfügt , das mit Visual Studio geliefert wird (seit VS2010 SP1). Dies ist eine abgespeckte Version von IIS, die genauso einfach zu verwenden ist wie der Development Server, jedoch den gesamten Funktionsumfang von IIS 7.5 einschließlich SSL unterstützt.
Scott Hanselman hat einen detaillierten Beitrag zur Arbeit mit SSL in IIS Express .
quelle
Wie wäre es, das RequireHttps-Attribut in einem benutzerdefinierten Attribut zu erben? Überprüfen Sie dann in Ihrem benutzerdefinierten Attribut die IsLocal-Eigenschaft der aktuellen Anforderung, um festzustellen, ob die Anforderung vom lokalen Computer stammt. Wenn dies der Fall ist, wenden Sie die Basisfunktionalität nicht an. Andernfalls rufen Sie die Basisoperation auf.
quelle
Dies funktionierte bei mir, MVC 6 (ASP.NET Core 1.0) . Der Code prüft, ob sich das Debug in der Entwicklung befindet. Andernfalls ist ssl nicht erforderlich. Alle Änderungen befinden sich in Startup.cs .
Hinzufügen:
Hinzufügen:
Bearbeiten:
quelle
Wenn Sie ableiten und überschreiben können, tun Sie es. Wenn Sie nicht können - MVC wird mit Quellen geliefert, nehmen Sie einfach die Quellen und erstellen Sie Ihr eigenes [ForceHttps] -Attribut, das IsLocal überprüft.
quelle
Für MVC 3 habe ich meinen eigenen FilterProvider hinzugefügt (basierend auf dem hier gefundenen Code: Globale und bedingte Filter , die unter anderem (Anzeigen von Debug-Informationen für lokale Benutzer usw.) alle Aktionen mit
RequireHttpsAttribute
wann dekorierenHttpContext.Request.IsLocal == false
.quelle
Nachdem ich mich umgesehen hatte, konnte ich dieses Problem mit IIS Express und einer Überschreibung der OnAuthorization-Methode der Controller-Klasse (Ref. 1) lösen. Ich bin auch die von Hanselman empfohlene Route gegangen (Ref. 2). Mit diesen beiden Lösungen war ich jedoch aus zwei Gründen nicht vollständig zufrieden: 1. Die OnAuthorization von Ref. 1 funktioniert nur auf Aktionsebene, nicht auf Controller-Klassenebene. 2. Ref. 2 erfordert viel Setup (Win7 SDK für makecert) ), netsh-Befehle, und um Port 80 und Port 443 zu verwenden, muss ich VS2010 als Administrator starten, was ich missbillige.
Also habe ich diese Lösung entwickelt, die sich auf Einfachheit unter den folgenden Bedingungen konzentriert:
Ich möchte das Attbbute RequireHttps auf Controller-Klassen- oder Aktionsebene verwenden können
Ich möchte, dass MVC HTTPS verwendet, wenn das RequireHttps-Attribut vorhanden ist, und HTTP verwendet, wenn es nicht vorhanden ist
Ich möchte Visual Studio nicht als Administrator ausführen müssen
Ich möchte alle HTTP- und HTTPS-Ports verwenden können, die von IIS Express zugewiesen wurden (siehe Hinweis 1).
Ich kann das selbstsignierte SSL-Zertifikat von IIS Express wiederverwenden, und es ist mir egal, ob die ungültige SSL-Eingabeaufforderung angezeigt wird
Ich möchte, dass Entwickler, Test und Produktion genau dieselbe Codebasis und dieselbe Binärdatei haben und so unabhängig wie möglich von zusätzlichen Einstellungen (z. B. Verwendung von Netsh, MMC-Zertifikat-Snap-In usw.) sind
Mit dem Hintergrund und der Erklärung aus dem Weg hoffe ich, dass dieser Code jemandem hilft und Zeit spart. Erstellen Sie grundsätzlich eine BaseController-Klasse, die von Controller erbt, und leiten Sie Ihre Controller-Klassen von dieser Basisklasse ab. Da Sie so weit gelesen haben, gehe ich davon aus, dass Sie wissen, wie man das macht. Also viel Spaß beim Codieren!
Hinweis 1: Dies wird durch die Verwendung einer nützlichen Funktion 'getConfig' erreicht (siehe Code).
Ref # 1: http://puredotnetcoder.blogspot.com/2011/09/requirehttps-attribute-in-mvc3.html
Ref # 2: http://www.hanselman.com/blog/WorkingWithSSLAtDevelopmentTimeIsEasierWithIISExpress.aspx
========== Code in BaseController ===================
============== Endcode ================
Fügen Sie in Web.Release.Config Folgendes hinzu, um HttpPort und HttpsPort zu löschen (um die Standardeinstellungen 80 und 443 zu verwenden).
quelle
Eine Lösung, die Sie sowohl in der Produktion als auch auf der Entwicklungsarbeitsstation verwenden können. Es basiert auf Ihrer Option aus den Anwendungseinstellungen in web.config
Wenn Sie kein SSL verwenden möchten, entfernen Sie den Schlüssel. Wenn Sie den Standard-SSL-Port 443 verwenden, entfernen Sie den Wert oder geben Sie 443 an.
Verwenden Sie dann die benutzerdefinierte Implementierung von RequireHttpsAttribute , die sich um Ihren Zustand kümmert. Es wird tatsächlich von RequireHttps abgeleitet und verwendet dieselbe Implementierung der Basismethode, außer dass Bedingungen hinzugefügt werden.
Vergessen Sie nicht, die LogOn- Methode in AccountController zu dekorieren
und so etwas in Ihrer LogOn- Ansicht, um ein Formular über https zu veröffentlichen.
quelle
Wie Joel bereits erwähnt hat, können Sie die Zusammenstellung mithilfe der
#if !DEBUG
Direktive ändern .Ich habe gerade herausgefunden, dass Sie den Wert des DEBUG-Symbols im Kompilierungselement der Datei web.config ändern können. Hoffentlich hilft das.
quelle
MVC 6 (ASP.NET Core 1.0):
Die richtige Lösung wäre die Verwendung von env.IsProduction () oder env.IsDevelopment (). Lesen Sie in dieser Antwort mehr über die Gründe dafür, wie Sie https nur in der Produktion benötigen .
Verkürzte Antwort unten (siehe Link oben, um mehr über Entwurfsentscheidungen zu erfahren) für 2 verschiedene Stile:
Startup.cs (Registerfilter):
BaseController.cs (Attributstil):
RequireHttpsInProductionAttribute : Beide oben genannten verwenden benutzerdefinierte Attribute, die von RequireHttpsAttribute erben :
quelle
Dies war der sauberste Weg für mich. In meiner
App_Start\FilterConfig.cs
Akte. Release-Builds können jedoch nicht mehr ausgeführt werden.Alternativ können Sie festlegen, dass nur https erforderlich ist, wenn Ihre benutzerdefinierte Fehlerseite aktiviert ist.
quelle
Weitere Informationen finden Sie in diesem Beitrag von Rick Anderson zu RickAndMSFT zu Azure & MVC. Füllen Sie die Azure-Lücke
http://blogs.msdn.com/b/rickandy/archive/2011/04/22/better-faster-easier-ssl-testing-for-asp-net-mvc-amp-webforms.aspx
quelle