Ich lerne gerade ASP.NET MVC, und ich habe kürzlich festgestellt, dass das [RequireHttps] -Attribut eine GET-Anfrage automatisch so umleiten lässt, dass sie SSL verwendet, so ...
%Vor% Wenn Sie IIS Express als Entwicklungsserver verwenden, wird die Anforderung erfolgreich von http://localhost:55945/...
nach https://localhost/...
umgeleitet.
Allerdings verwendet mein Projekt auf meinem Entwicklungssystem HTTPS auf Port 44300 (dies wurde von Visual Studio 2010 automatisch konfiguriert), und ich habe noch keine Möglichkeit gefunden, MVC mitzuteilen, diese Portnummer in der Umleitung zu verwenden es geht stattdessen zu dem erforderlichen https://localhost:43300/...
.
Ich habe wirklich erwartet, dass dies automatisch erfolgt, da die SSL-Portnummer von Visual Studio automatisch festgelegt wurde. Soweit ich feststellen kann, muss dies alle Entwickler betreffen, die das Attribut [RequireHttps] in MVC3 verwenden. Auf der Suche nach einer Lösung habe ich ein paar lückenhafte Lösungen gefunden, aber es scheint nichts definitiv "der richtige Weg" zu sein, um es zu beheben.
Wenn Sie also "den richtigen Weg" gehen, ändern Sie (entweder im Quellcode oder in meiner Projektkonfiguration) das Attribut [RequireHttps] in MVC3, um den HTTPS-Port zu verwenden, für den mein Projekt konfiguriert ist verwenden?
Oder gibt es alternativ noch einen anderen völlig anderen und besseren "richtigen Weg", die SSL-Unterstützung in einem MVC3-Projekt einzurichten, das dieses Problem nicht hat?
Das RequireHttpsAttribute ist ziemlich einfach und kann nicht parametrisiert werden, um zu einem bestimmten Port umzuleiten. Wenn Sie dies wirklich benötigen, können Sie eine Unterklasse erstellen und die HandleNonHttpsRequest-Methode überschreiben, um die Weiterleitungs-URL anders zu verfassen.
%Vor%Wenn Ihre gesamte Site jedoch mit HTTPS ausgeführt wird, können Sie einfach in VS in den Webprojekteigenschaften (Web - & gt; Aktion starten - & gt; Start URL) konfigurieren, um die korrekte HTTPS-URL mit Ihrem Port zu öffnen und die Weiterleitung nicht zu verwenden Feature für lokale Tests.
Ein paar Dinge, die hilfreich sein könnten.
In diesem Thread gibt es eine Version des Quellcodes von RequireHttpsAttribute: Wo ist das? Quelle für RequireHttpsAttribute?
Es gibt auch eine fast identische Klasse namens RequireSslAttribute auf Codeplex, die im selben Thread erwähnt wird. Ссылка
Hier ist ein Beispiel für ein Attribut, mit dem abhängig von der TargetUriScheme-Eigenschaft entweder von http zu https oder umgekehrt umgeschaltet werden kann. Es enthält auch Eigenschaften für die Angabe von Portnummern.
Ich habe entschieden, einen #if-DEBUG-Block in meinem Konstruktor zu verwenden, um meine lokalen Entwicklungsports festzulegen, wenn ich unter der Debug-Konfiguration baue. Das funktioniert für mich, da ich beim Deployment immer unter Release bilde. In diesem Fall werden die Portnummern standardmäßig auf null gesetzt und von den URLs weggelassen.
Die Portnummern können auch festgelegt werden, wenn das Attribut auf eine Aktionsmethode angewendet wird. Ich könnte auch sehen, diese an eine Konfigurationsdatei oder eine andere Konfigurationsquelle zu hängen, um die Portnummern zur Laufzeit zu bestimmen.
%Vor% Ich habe das gleiche Problem, und ich löse es, indem ich sowohl die RequireHttpsAttribute
als auch eine URL Rewrite-Regel in Web.config
verwende. Die Rewrite-Regel stimmt mit den nicht standardmäßigen Portnummern überein und wird vor dem Attribut ausgeführt. Sie können eine Web.config-Transformation verwenden, um die Rewrite-Regel bei der Bereitstellung zu entfernen. Wenn Sie sie jedoch beibehalten, sollte sie keine Auswirkungen haben. In der Produktion verwenden Sie die Standard-Portnummer, für die die Regel nicht passt. Dann fängt das Attribut es ab.
Hier ist die Regel:
%Vor%Der Nachteil dieses Ansatzes besteht darin, dass Sie sich bei lokaler Ausführung nicht auf das Attribut verlassen. Aber wenn Sie es einmal global angewendet haben, anstatt es jedem Controller hinzuzufügen, ist das meiner Meinung nach in Ordnung.
Ich bin ziemlich verwirrt darüber, warum ich stundenlang versuchen musste, das richtig zu machen. Ich habe eine URL-Neufassung ähnlich wie Scott Hanselman hier erklärt:
Ссылка x
Das funktioniert perfekt und ich nehme nur die Rewrite-Regel auf meinem Produktions-Webserver heraus.
Tags und Links asp.net-mvc-3 c# ssl https