Wie kann ich Benutzer bestimmen und zwingen, meine Website nur mit HTTPS anzuzeigen? Ich weiß, dass es über IIS getan werden kann, aber wissen möchte, wie es programmgesteuert gemacht wird.C# So ermitteln Sie, ob HTTPS
Antwort
Sie können einen HttpModule
so schreiben.
EDIT: und natürlich, nicht vergessen eine Moduldefinition zu einem web.config
hinzuzufügen:
<system.web>
<httpModules>
<!--Used to redirect all the unsecure connections to the secure ones if necessary-->
<add name="Security" type="{YourNamespace}.Handlers.SecurityModule, {YourAssembly}" />
...
</httpModules>
</system.web>
Die meisten Web-Anwendungen haben eine _global.asax_ Seite, die auch den gleichen Code enthält, wie von Alex angegeben. Geben Sie einfach den Handler Application_BeginRequest an. – Rajiv
Was mir bei meinem Problem geholfen hat, war Request.IsSecureConnection, stellen Sie sicher, dass die Anfrage in diesem Fall großgeschrieben wird, es sei denn, Sie erstellen eine var-definierte Anfrage wie Alex. Nur etwas, das man im Kopf behalten sollte. –
Es gibt eine kleinere Anmerkung zu diesem: Sie müssen die integrierte Moduskonfiguration unter 'system.webServer' deaktivieren, wobei das' validateIntegratedModeConfiguration'-Attribut des 'validation'-Attributs auf' false' gesetzt ist (siehe [diese Antwort] (http://stackoverflow.com)/a/4210026) für weitere Details). Außerdem, wenn Sie IIS Express oder IIS 6 verwenden möchten, sollten Sie [diese andere Antwort] (http://stackoverflow.com/a/963975) notieren –
Dieser Artikel behandelt das Verschieben von Anforderungen innerhalb und außerhalb von SSL. Manchmal möchten Sie nicht, dass der Benutzer eine Seite in SSL anzeigt, weil er proc-Zyklen für Seiten verbrennt, die nicht gesichert werden müssen.
/// <summary>
/// Used to correct non-secure requests to secure ones.
/// If the website backend requires of SSL use, the whole requests
/// should be secure.
/// </summary>
public class SecurityModule : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication application)
{
application.BeginRequest += new EventHandler(application_BeginRequest);
}
protected void application_BeginRequest(object sender, EventArgs e)
{
HttpApplication application = ((HttpApplication)(sender));
HttpRequest request = application.Request;
HttpResponse response = application.Response;
// if the secure connection is required for backend and the current
// request doesn't use SSL, redirecting the request to be secure
if ({use SSL} && !request.IsSecureConnection)
{
string absoluteUri = request.Url.AbsoluteUri;
response.Redirect(absoluteUri.Replace("http://", "https://"), true);
}
}
}
Wo {use SSL}
eine bestimmte Bedingung ist, ob die Verwendung von SSL oder nicht:
http://weblogs.asp.net/kwarren/archive/2005/07/08/418541.aspx
Sie würden diese von VB.NET auf C# konvertieren, aber das ist was ich in meinen Websites verwenden:
Imports System.Web.HttpContext
Public Shared Sub SetSSL(Optional ByVal bEnable As Boolean = False)
If bEnable Then
If Not Current.Request.IsSecureConnection Then
Dim strHTTPS As String = "https://www.mysite.com"
Current.Response.Clear()
Current.Response.Status = "301 Moved Permanently"
Current.Response.AddHeader("Location", strHTTPS & Current.Request.RawUrl)
Current.Response.End()
End If
Else
If Current.Request.IsSecureConnection Then
Dim strHTTP As String = "http://www.mysite.com"
Current.Response.Clear()
Current.Response.Status = "301 Moved Permanently"
Current.Response.AddHeader("Location", strHTTP & Current.Request.RawUrl)
Current.Response.End()
End If
End If
End Sub
es ist mehr Code als einige der anderen Techniken, aber es gibt einen Grund dafür. Diese Methode wird nur umgeleitet, wenn sie nicht in dem Modus ist, in dem sie sein sollte. Und wenn sie eine Umleitung ausführt, führt sie eine 301 (permanente) Umleitung durch. Der Vorteil besteht darin, dass Suchmaschinen der 301-Umleitung folgen und somit verhindern, dass sie dieselbe Seite zweimal indexieren (im HTTP- und HTTPS-Modus). Sie können dies mit dem Standardverhalten von Response.Redirect (302 temporäre Weiterleitung) vergleichen, das Google zum Beispiel nicht auf die gleiche Weise behandelt. Sie ändern ihren Index nicht basierend auf einer temporären Weiterleitung.
Also, wenn Sie auf einer Seite sind, die Sie möchten SSL-verschlüsselt sein, es so nennen:
SetSSL (True)
Ansonsten:
SetSSL (False)
Und wenn Sie wirklich benötigen, dass dies global angewendet wird, würde ich SetSSL (True) in der Application_BeginRequest Ihrer global.asax aufrufen. Seien Sie vorsichtig, dass SSL die Dinge ein wenig verlangsamen wird. Aus diesem Grund bin ich typischerweise sehr selektiv, wenn ich zwischen http und https wechsle. Aus Dutzenden von Websites, die ich entwickelt habe, gibt es nur zwei, die SSL auf der gesamten Website verwenden.
IIR können Sie die Anforderung überprüfen (HttpContext.Current.Request) für die Domäne, die Sie dann überprüfen, welches Protokoll verwendet wird (http, https, ftp, etc.)
Ein bisschen hart codiert aber straighforward!
if (!HttpContext.Current.Request.IsSecureConnection)
{
Response.Redirect("https://www.foo.com/foo/");
}
+1 ein HTTP-Modul scheint hier wie Overkill, aber ich mag dies weil es kurz und gut, danke. –
einfach, kurz und funktioniert, – dvdmn
Sie können auch eine Rewrite-Regel in Ihrer web.config unter dem system.webServer
-Tag einrichten. zB:
<rewrite>
<rules>
<rule name="Redirect to HTTPS" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" matchType="Pattern" pattern="^localhost(:\d+)?$" negate="true" ignoreCase="true" />
<add input="{HTTP_HOST}" matchType="Pattern" pattern="^127\.0\.0\.1(:\d+)?$" negate="true" />
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" />
</rule>
</rules>
</rewrite>
- 1. So ermitteln Sie, ob eine Datei unbekannter Dateityp ist C#
- 2. So ermitteln Sie, ob eine C++ - Vorlage die Methode
- 3. So ermitteln Sie, ob NSString leer ist
- 4. Ermitteln, ob auf der Site HTTPS ausgeführt wird
- 5. So ermitteln Sie, ob ein Verzeichnispfad SUBST'd wurde
- 6. So ermitteln Sie, ob das Benutzerkonto aktiviert oder deaktiviert ist
- 7. So entfernen Sie https
- 8. So ermitteln Sie Mindestsystemanforderungen
- 9. So ermitteln Sie, ob KeyCode druckbares Zeichen ist
- 10. So ermitteln Sie, ob MethodInfo eine Überschreibung der Basismethode ist
- 11. So ermitteln Sie, ob eine meiner Aktivitäten im Vordergrund ist
- 12. So ermitteln Sie, ob eine Shellskriptdatei aus der Bash stammt
- 13. So ermitteln Sie, ob Eclipse im Debug-Modus ausgeführt wird
- 14. So ermitteln Sie, ob Git merge ausgeführt wird
- 15. So ermitteln Sie, ob SmartLock auf dem Gerät aktiviert ist
- 16. So ermitteln Sie, ob ein WebView vollständig herausgezoomt ist
- 17. So ermitteln Sie, ob es eine referenzielle Integritätsverletzung gibt
- 18. So ermitteln Sie, ob Pheanstalk-Jobs abgeschlossen sind
- 19. So ermitteln Sie, ob ein Kennwort erforderlich ist
- 20. So ermitteln Sie, ob TextView-Textinhalt abgeschnitten wurde
- 21. So ermitteln Sie, ob das Laufwerk ein externes Laufwerk ist
- 22. So ermitteln Sie, ob der Remoting-Kanal bereits registriert ist
- 23. So ermitteln Sie, ob zwei Kreissektoren miteinander überlappen
- 24. So ermitteln Sie, ob eine Webanwendung gerade ausgeführt wird
- 25. So ermitteln Sie, ob die Methode zur Laufzeit asynchron ist
- 26. So ermitteln Sie, ob der Mauszeiger in einem Steuerelement ist
- 27. So ermitteln Sie, ob ein Ereignis bereits abonniert wurde
- 28. So ermitteln Sie, ob das Feld in AngularJS ausgewählt ist
- 29. Ermitteln, ob das HTML-Eingabeelement in C#
- 30. So ermitteln Sie absolute Orientierung
So: http://www.jameskovacs.com/blog/HowToAutoRedirectToASSLsecuredSiteInIIS.aspx –