Jak określić i zmusić użytkowników do przeglądania mojej witryny tylko przy użyciu HTTPS? Wiem, że można to zrobić za pomocą IIS, ale chcę wiedzieć, jak to zrobić programowo.C# Jak ustalić, czy HTTPS
Odpowiedz
Można napisać HttpModule
takiego:
/// <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);
}
}
}
{use SSL}
Gdzie jest jakiś warunek, czy używać SSL, czy nie.
EDIT, i, oczywiście, nie zapomnij dodać definicję modułu do web.config
:
<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>
Większość aplikacji internetowych mieć stronę _global.asax_ które mogą również obejmować ten sam kod co wskazuje Alex. Wystarczy podać instrukcję obsługi Application_BeginRequest. – Rajiv
Pomógł mi mój problem.IsSecureConnection, upewniając się, że w tym przypadku zostanie zamapowana duża liczba żądań, chyba że utworzysz żądanie o nazwie var, takie jak Alex. Tylko coś do zapamiętania. –
Jest to drobna uwaga: Musisz wyłączyć konfigurację trybu zintegrowanego pod 'system.webServer' za pomocą atrybutu' validateIntegratedModeConfiguration' znacznika 'validation' ustawionego na' false' (patrz [ta odpowiedź] (http://stackoverflow.com/a/4210026) po więcej szczegółów). Ponadto, jeśli chcesz korzystać z usług IIS Express lub IIS 6, powinieneś zwrócić uwagę na [tę inną odpowiedź] (http://stackoverflow.com/a/963975) –
W tym artykule omówiono poruszające się prośby zi do protokołu SSL. Czasami nie chcesz, aby użytkownik przeglądał stronę w SSL, ponieważ wypala cykle proc na stronach, które nie muszą być zabezpieczone.
http://weblogs.asp.net/kwarren/archive/2005/07/08/418541.aspx
Trzeba przekonwertować to z VB.NET do C#, ale to jest co używam w moich stron:
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
To więcej niż kod niektórych innych technik, ale nie ma powodu, dla niego. Ta metoda przekieruje tylko wtedy, gdy nie znajduje się w trybie, w którym powinna się znajdować. A kiedy wykonuje przekierowanie, dokonuje 301 przekierowania (stałego). Korzyścią jest to, że wyszukiwarki będą podążać za przekierowaniem 301, co uniemożliwi im dwukrotne indeksowanie tej samej strony (w trybie http i https). Można to porównać z domyślnym działaniem Response.Redirect (302 tymczasowe przekierowanie), którego Google na przykład nie traktuje w ten sam sposób. Nie zmienią oni swojego indeksu na podstawie tymczasowego przekierowania.
Więc jeśli jesteś na stronie, którą chcesz być SSL szyfrowane, nazwać tak:
SetSSL (True)
Inaczej:
SetSSL (fałsz)
A jeśli naprawdę potrzebujesz tego do globalnego zastosowania, nazwałbym SetSSL (True) w Application_BeginRequest twojego global.asax. Uważaj, że protokół SSL nieco spowolni. Z tego powodu zazwyczaj przełączam się między http i https. W rzeczywistości, spośród kilkudziesięciu opracowanych przeze mnie witryn, tylko dwie używały SSL w całej witrynie.
IIR można sprawdzić żądanie (HttpContext.Current.Request) dla domeny, która następnie może sprawdzić, co jest używany protokół (HTTP, HTTPS, FTP, etc)
Trochę zakodowanego ale straighforward!
if (!HttpContext.Current.Request.IsSecureConnection)
{
Response.Redirect("https://www.foo.com/foo/");
}
+1 moduł http wygląda jak przesada tutaj, ale podoba mi się to bo to krótkie i słodkie, dzięki. –
prosty, krótki i działa, – dvdmn
Można również skonfigurować reguły przepisywania w web.config pod tagiem system.webServer
. np:
<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. Jak ustalić, czy matematyka C używa SSE2?
- 2. Jak ustalić, czy obiekt EnvDTE.Project reprezentuje projekt C/C++?
- 3. Jak ustalić, czy dotknięto UILabel?
- 4. Jak ustalić, czy GraphicsEnvironment istnieje
- 5. Jak ustalić, czy podkatalog istnieje w języku C#?
- 6. Jak ustalić, czy system operacyjny to POSIX w C?
- 7. C# HttpWebRequest - Jak ustalić, czy wystąpił błąd HTTP 301?
- 8. Jak ustalić, czy dwa węzły są połączone?
- 9. Jak ustalić, czy ścieżka jest podkatalogiem innej?
- 10. Jak ustalić, czy identyfikator procesu istnieje
- 11. Jak ustalić, czy Kopiowanie lokalne jest konieczne?
- 12. C# WebClient z https
- 13. Jak ustalić, czy obiekt istnieje w tablicy, czy nie javascript
- 14. Jak ustalić, czy tablica asocjacyjna ma klucz?
- 15. Jak ustalić, czy połączona lista zawiera pętlę?
- 16. Jak ustalić, czy drzewo binarne jest kompletne?
- 17. Jak ustalić, czy lista dwuwymiarowa zawiera wartość?
- 18. Jak ustalić, czy obiekt jQuery jest odroczony?
- 19. jQuery - Jak ustalić, czy istnieje element rodzica?
- 20. Jak ustalić, czy powiązanie szyn jest przyspieszone?
- 21. Jak ustalić, czy ciąg zawiera konkretny podłańcuch
- 22. Jak ustalić, czy jednostka doktrynalna jest trwała?
- 23. Jak ustalić, czy testy PHPUnit są uruchomione?
- 24. Jak ustalić, czy istnieje skrót ekranu głównego?
- 25. Jak ustalić, czy NSString jest pusty?
- 26. Jak ustalić, czy IType jest klasą abstrakcyjną?
- 27. Jak ustalić, czy tabela sql jest tymczasowa?
- 28. Jak ustalić, czy ciąg ma niealfanumeryczne znaki?
- 29. Jak ustalić, czy ParameterInfo jest typu ogólnego?
- 30. Jak ustalić, czy dany ciąg reprezentuje datę?
Jak to: http://www.jameskovacs.com/blog/HowToAutoRedirectToASSLsecuredSiteInIIS.aspx –