2012-01-24 5 views
6

Znalazłem This Post i wygląda na to, czego potrzebowałem do aplikacji, moje pytanie brzmi: w jaki sposób powrócić do zwykłego http, gdy https nie jest już potrzebny? Czy z natury to zrobi na podstawie akcji, która nie ma adnotacji [RequireHttps]?MVC3 po [RequireHttps] jak zapewnić non https jest używany

EDYCJA: Znalazłem kilka postów mówiących o przejściu z https na http (here & here). Jednak nadal będę wdzięczny za odpowiedź na poniższe pytanie.

Alternatywnie, debatowałem nad otwarciem aplikacji w nowym oknie. Czy to słuszne założenie, że https będzie dotyczyło tylko nowego okna?

+0

raz użytkownik żeglował przez requirehttps, jeśli wrócą do kontrolera bez requirehttps nadal będą pod https. –

+0

dlaczego wrócić do zwykłego http? Istnieje tam ogromne ryzyko bezpieczeństwa, po pierwsze żetony uwierzytelniania formularzy są przesyłane w postaci zwykłego tekstu, a identyfikatory sesji mogą być łatwo wciągane. Użyj RequireSsl na formularzu auth (jeśli używasz go), ale z kolei notatka wszędzie, gdzie nie jest ssl, zawiedzie. Uruchom całą witrynę ssl + Dowiedz się, jak łatwo jest ukraść sesję z pojedynczego zalogowanego pakietu http. –

+0

@AdamTuliper Obecnie nie mam/potrzebuję żadnego uwierzytelnienia. Używam tego do wniosku o zatrudnienie. Po jej przesłaniu nie ma sensu dłużej szyfrować przeglądania. Nie przechowuję niczego w sesji. Nasz serwer internetowy wstaje z wiekiem, więc wszystko, co mogę zrobić, aby złagodzić obciążenie, jest potrzebne, więc jeśli już nie potrzebuję ssl, to po co zawracać sobie głowę? Wątpię, aby szyfrowanie powodowało awarie maszyny, ale po prostu nie używam go tam, gdzie nie jest to konieczne, ponieważ szyfrowanie zasobów nie jest bezpłatne. – Jared

Odpowiedz

7

Wymaganie ASP.NET MVCHttps działa tylko w jedną stronę. W przeszłości właśnie stworzył własną implementację FilterAttribute celu umożliwienia podróży w obie strony:

EnsureHttpsAttribute

public class EnsureHttpsAttribute : FilterAttribute, IAuthorizationFilter 
    { 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     Verify.NotNull(filterContext, "filterContext"); 
     Verify.True(filterContext.HttpContext.Request.HttpMethod.Equals("GET", StringComparison.OrdinalIgnoreCase), "filterContext"); 

     var request = filterContext.HttpContext.Request; 
     if (request.Url != null && !request.IsSecureConnection && !request.IsLocal) 
     filterContext.Result = new RedirectResult("https://" + request.Url.Host + request.RawUrl); 
    } 
    } 

EnsureHttpAttribute

public class EnsureHttpAttribute : FilterAttribute, IAuthorizationFilter 
    { 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     Verify.NotNull(filterContext, "filterContext"); 
     Verify.True(filterContext.HttpContext.Request.HttpMethod.Equals("GET", StringComparison.OrdinalIgnoreCase), "filterContext"); 

     var request = filterContext.HttpContext.Request; 
     if (request.Url != null && request.IsSecureConnection) 
     filterContext.Result = new RedirectResult("http://" + request.Url.Host + request.RawUrl); 
    } 
    } 

Prawie taka sama realizacja jak RequireHttpsAttribute jeśli mnie pamięć nie myli ; chociaż powyższa implementacja sprawdza, czy jest to żądanie Local i ignoruje przejście na HTTPS.

+0

jakieś myśli na temat drugiej części mojego pytania? Jeśli otworzę akcję w nowym oknie, czy mam rację, zakładając, że https zostanie zastosowany tylko w nowym oknie? – Jared

+0

Zakładając względne adresy URL w wyskakującym oknie, wszystko w nowym oknie pozostanie HTTPS, chyba że masz bezwzględny URL, aby jawnie przełączyć się z powrotem na HTTP. Okno nadrzędne pozostanie w http, chyba że wyraźnie nawigujesz lub przekierowujesz do HTTPS. –

+0

Prawdopodobnie przekierowanie żądań POST nie jest dobrym pomysłem, ponieważ może to zmylić przeglądarkę. Oficjalna implementacja atrybutu. – nakhli

2
+0

Interesujący artykuł i dobre informacje. W tej chwili jednak nie uwierzytelniam się w mojej witrynie.Kiedy to nastąpi, mogłem zobaczyć, że jest to bardzo przydatne, więc dziękuję za link. – Jared

+0

Wierzę, że z innych odpowiedzi i wpisów na SO wynika, że ​​większość ludzi kończy pisanie własnego atrybutu niestandardowego do obsługi wyjątkowych sytuacji. –

+0

Jak dotąd tak wyglądało. Myślę, że najprawdopodobniej zrobię to automatycznie po przekierowaniu do bezwzględnego adresu URL bez https, gdy tylko wypełni formularz lub otworzy nowe okno w https i opuści poprzednie okno przeglądarki. – Jared

Powiązane problemy