Chcę użyć RequireHttpsAttribute, aby zapobiec wysyłaniu niezabezpieczonych żądań HTTP do metody akcji.
DO#
[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
Niestety serwer programistyczny ASP.NET nie obsługuje protokołu HTTPS.
Jak sprawić, by moja aplikacja ASP.NET MVC korzystała z RequireHttps po opublikowaniu w środowisku produkcyjnym, ale nie w przypadku uruchomienia na mojej deweloperskiej stacji roboczej na serwerze programistycznym ASP.NET?
asp.net-mvc
visual-studio
ssl
https
Zack Peterson
źródło
źródło
Odpowiedzi:
To nie pomoże, jeśli uruchomisz kompilacje wydania na swojej stacji roboczej, ale kompilacja warunkowa może załatwić sprawę ...
Aktualizacja
W języku Visual Basic atrybuty są technicznie częścią tego samego wiersza, co definicja, do której się odnoszą. Nie możesz umieścić instrukcji kompilacji warunkowej w linii, więc musisz dwukrotnie napisać deklarację funkcji - raz z atrybutem, a raz bez. Ale działa, jeśli nie przeszkadza ci brzydota.
Zaktualizuj 2
Kilka osób wspomniało o pochodzeniu z programu
RequireHttpsAttribute
bez podania przykładu, więc oto jeden dla Ciebie. Myślę, że to podejście byłoby znacznie czystsze niż podejście kompilacji warunkowej i na twoim stanowisku wolałbym to.ZRZECZENIE SIĘ: Nie testowałem tego kodu, nawet trochę, a mój VB jest dość zardzewiały. Wiem tylko, że się kompiluje. Napisałem go w oparciu o sugestie spot, queen3 i Lance Fisher. Jeśli to nie zadziała, powinno przynajmniej przekazać ogólną ideę i dać punkt wyjścia.
Zasadniczo nowy atrybut po prostu kończy działanie, zamiast uruchamiać domyślny kod autoryzacji SSL, jeśli bieżące żądanie jest lokalne (to znaczy uzyskujesz dostęp do witryny za pośrednictwem hosta lokalnego). Możesz go używać w ten sposób:
Dużo czystsze! Pod warunkiem, że mój niesprawdzony kod faktycznie działa.
źródło
Jeśli ktoś potrzebuje wersji C #:
źródło
filters.Add(new MyRequireHttpsAttribute ());
wFilterConfig
?Wyprowadzanie z RequireHttps to dobre podejście.
Aby całkowicie obejść ten problem, możesz użyć usług IIS na komputerze lokalnym z certyfikatem z podpisem własnym. Usługi IIS są szybsze niż wbudowany serwer internetowy, a masz tę zaletę, że środowisko programistyczne bardziej przypomina produkcję.
Scott Hanselman ma świetne źródło informacji na temat kilku sposobów implementacji lokalnego protokołu HTTPS w VS2010 i IIS Express.
źródło
Wykorzystując system filtrów MVC i Global.asax.cs, zakładam, że możesz to zrobić ...
źródło
Ponieważ to właśnie serwer deweloperski ASP.Net spowodował problem w pierwszej kolejności, warto zauważyć, że Microsoft ma teraz IIS Express , który jest dostarczany z Visual Studio (od VS2010 SP1). Jest to okrojona wersja usług IIS, która jest równie łatwa w użyciu jak serwer deweloperski, ale obsługuje pełny zestaw funkcji usług IIS 7.5, w tym SSL.
Scott Hanselman opublikował szczegółowy post dotyczący pracy z protokołem SSL w IIS Express .
źródło
Co powiesz na dziedziczenie atrybutu RequireHttps w atrybucie niestandardowym. Następnie w atrybucie niestandardowym sprawdź właściwość IsLocal bieżącego żądania, aby sprawdzić, czy żądanie pochodzi z komputera lokalnego. Jeśli tak, nie stosuj podstawowej funkcji. W przeciwnym razie wywołaj operację bazy.
źródło
To zadziałało dla mnie, MVC 6 (ASP.NET Core 1.0) . Kod sprawdza, czy debugowanie jest w trakcie opracowywania, a jeśli nie, protokół SSL nie jest wymagany. Wszystkie zmiany znajdują się w Startup.cs .
Dodaj:
Dodaj:
Edytować:
źródło
Jeśli możesz wyprowadzić i nadpisać - zrób to. Jeśli nie możesz - MVC zawiera źródła, po prostu weź źródła i utwórz własny atrybut [ForceHttps], który sprawdza IsLocal.
źródło
Do MVC 3 dodałem własnego FilterProvider (na podstawie kodu znalezionego tutaj: filtry globalne i warunkowe, które między innymi (wyświetlanie informacji o debugowaniu dla lokalnych użytkowników itp.) Będą dekorować wszystkie akcje
RequireHttpsAttribute
kiedyHttpContext.Request.IsLocal == false
.źródło
Po wielu badaniach udało mi się rozwiązać ten problem za pomocą IIS Express i nadpisania metody OnAuthorization klasy kontrolera (Ref # 1). Poszedłem też trasą polecaną przez Hanselmana (Ref # 2). Jednak nie byłem w pełni usatysfakcjonowany tymi dwoma rozwiązaniami z dwóch powodów: 1. Autoryzacja OnAuthorization Ref # 1 działa tylko na poziomie akcji, a nie na poziomie klasy kontrolera 2. Ref # 2 wymaga dużo konfiguracji (Win7 SDK dla makecert ), polecenia netsh i, aby użyć portu 80 i portu 443, muszę uruchomić VS2010 jako administrator, na co marszczę brwi.
Tak więc wymyśliłem to rozwiązanie, które stawia na prostotę przy następujących warunkach:
Chcę móc używać attbbute RequireHttps na poziomie klasy kontrolera lub akcji
Chcę, aby MVC używał protokołu HTTPS, gdy atrybut RequireHttps jest obecny, i protokołu HTTP, jeśli go nie ma
Nie chcę uruchamiać programu Visual Studio jako administrator
Chcę mieć możliwość korzystania z dowolnych portów HTTP i HTTPS przypisanych przez IIS Express (patrz uwaga nr 1)
Mogę ponownie użyć samopodpisanego certyfikatu SSL programu IIS Express i nie obchodzi mnie, czy widzę nieprawidłowy monit SSL
Chcę, aby tworzenie, testowanie i produkcja miały dokładnie taką samą bazę kodu i ten sam plik binarny oraz były niezależne od dodatkowej konfiguracji (np. Przy użyciu netsh, przystawki mmc cert itp.)
Teraz, po usunięciu tła i wyjaśnień, mam nadzieję, że ten kod pomoże komuś i zaoszczędzi trochę czasu. Zasadniczo utwórz klasę BaseController, która dziedziczy po kontrolerze, i wyprowadź klasy kontrolera z tej klasy bazowej. Ponieważ przeczytałeś tak daleko, zakładam, że wiesz, jak to zrobić. Życzymy miłego kodowania!
Uwaga nr 1: Osiąga się to za pomocą użytecznej funkcji „getConfig” (patrz kod)
Nr ref. 1: http://puredotnetcoder.blogspot.com/2011/09/requirehttps-attribute-in-mvc3.html
Nr ref. 2: http://www.hanselman.com/blog/WorkingWithSSLAtDevelopmentTimeIsEasierWithIISExpress.aspx
========== Kod w BaseController ===================
============== kod końcowy ================
W Web.Release.Config dodaj następujący kod, aby wyczyścić HttpPort i HttpsPort (aby użyć domyślnych 80 i 443).
źródło
Jedno rozwiązanie, którego możesz używać zarówno na produkcji, jak i na stanowiskach programistycznych. Opiera się na opcji z ustawień aplikacji w web.config
Jeśli nie chcesz używać SSL, usuń klucz. Jeśli używasz standardowego portu SSL 443, usuń wartość lub podaj 443.
Następnie użyj niestandardowej implementacji RequireHttpsAttribute, która dba o Twój stan. W rzeczywistości pochodzi z RequireHttps i używa tej samej implementacji metody podstawowej, z wyjątkiem dodawania warunków.
Nie zapomnij udekorować metody LogOn w AccountController
i coś takiego w widoku LogOn, aby wysłać formularz przez https.
źródło
Jak wspomniał Joel, możesz zmienić kompilację za pomocą
#if !DEBUG
dyrektywy.Właśnie się dowiedziałem, że możesz zmienić wartość symbolu DEBUG w elemencie kompilacji pliku web.config. Mam nadzieję, że to pomoże.
źródło
MVC 6 (ASP.NET Core 1.0):
Właściwym rozwiązaniem byłoby użycie env.IsProduction () lub env.IsDevelopment (). Przeczytaj więcej o powodach w tej odpowiedzi, jak wymagać protokołu HTTPS tylko w środowisku produkcyjnym .
Poniżej skrócona odpowiedź (patrz link powyżej, aby przeczytać więcej o decyzjach projektowych) dla 2 różnych stylów:
Startup.cs (filtr rejestru):
BaseController.cs (styl atrybutu):
RequireHttpsInProductionAttribute : Oba powyższe używają atrybutu niestandardowego dziedziczącego po RequireHttpsAttribute :
źródło
To był dla mnie najczystszy sposób. W moim
App_Start\FilterConfig.cs
pliku. Nie można już jednak uruchamiać kompilacji wydań.Alternatywnie możesz ustawić, aby wymagał protokołu HTTPS tylko wtedy, gdy włączona jest niestandardowa strona błędu.
źródło
Zapoznaj się z tym postem autorstwa Ricka Andersona na temat RickAndMSFT na platformach Azure i MVC Wypełnianie luki Azure
http://blogs.msdn.com/b/rickandy/archive/2011/04/22/better-faster-easier-ssl-testing-for-asp-net-mvc-amp-webforms.aspx
źródło