Tag Archives: ASP.NET MVC

Deploy web aplikacji do chmury

Jeżeli przy tworzeniu nowego projektu w Visual Studio nie zaznaczyliśmy opcji „Host in the cloud”, ale chcemy opublikować naszą aplikacje w chmurze Azure, to ten krótki poradnik może okazać się przydatny. Pierwszą rzeczą jaką musimy zrobić jest stworzenie web aplikacji w Azure.
Wybieramy Usługi aplikacji z portalu i klikamy dodaj

clip_image001

Po stworzeniu aplikacji, możemy pobrać profil jej ustawień klikając „Pobierz profil…”

clip_image002

Otwieramy solucję w Visual Studio, wybieramy projekt do deployu i wybieramy Publish, a następnie Import i wybieramy plik z profilem *.PublishSettings pobrany z portalu Azure.

clip_image003

clip_image004

clip_image005

Dla pewności możemy wykonać test połączenia oraz upragniony Publish. That’s it. Nasza aplikacja już działa na Azure, przynajmniej powinna, o ile stworzyliśmy wcześniej także bazę danych i zmieniliśmy odpowiednio ConnectionStringa w web.configu.

Kontroler i Akcje

W tym wpisie przyjrzymy się kontrolerom w aplikacji ASP.NET MVC oraz akcjom, które mogą one zawierać. Kontrolery są odpowiedzialne za odpowiadanie na żądania użytkownika. Każde żądanie kierowane z przeglądarki jest obsługiwane przez określony kontroler. Przykładowo użytkownik klika przycisk odpowiadający za dodanie nowego wydarzenia, natomiast kontroler (EventsController) w odpowiedzi wyświetla odpowiedni widok. Akcja, która się w tym przypadku wykona jest zawarta w metodzie Create typu GET.

Zgodnie z dobrymi praktykami należy pamiętać, że w kontrolerze nie powinno być zawartej logiki biznesowej, ani logiki odpowiedzialnej za dostęp do danych. No dobrze, ale jak to się dzieje że akcje są wykonywane przez odpowiednie metody kontrolera? Za to odpowiedzialny jest routing. Przykładowo wywołujemy URL: http://localhost/Events/Create i w tym przypadku zostanie wywołana metoda Create() z klasy EventsController. Akcje kontrolera muszą być metodami publicznymi. Także każda metoda publiczna w kontrolerze staje się wystawioną na zewnątrz akcją. Każda akcja zwraca typ ActionResult. W przypadku powyższej metody Create zwracany jest typ ViewResult. Wystarczy zwrócić wynik metody View(), a zwrócony zostanie widok o nazwie Create znajdujący się w katalogu Events (czyli o takiej samej nazwie jak kontroler). Identyczny efekt osiągniemy gdy wywołamy metodę View(„Create”), wtedy jawnie wskazujemy nazwę widoku. Poza typem ViewResult w ASP.NET MVC jest dostępnych jeszcze kilka innych typów. Lista wszystkich typów prezentuje się następująco:

  • ViewResult – zwraca widok
  • PartialViewResult – zwraca widok częściowy
  • EmptyResult – zwraca null
  • RedirectResult – przekierowuje do innej akcji za pomocą adresu URL
  • RedirectToRouteResult – przekierowuje do innej akcji bez odwiedzania adresu URL
  • JsonResult – zwraca dane w postaci JSON
  • JavaScriptResult – zwraca kod w postaci JavaScript
  • ContentResult – zwraca wartość tekstową
  • FileContentResult – reprezentuje plik do pobrania, jako tablicę bitów
  • FilePathResult – zwraca ścieżkę do pliku
  • FileStreamResult – reprezentuje plik do pobrania, jako strumień danych

Każdy z typów dziedziczy z klasy bazowej ActionResult. Poniżej znajdują się przykładowe implementacje akcji:

 

Zabezpieczenie przed atakami CSRF w ASP.NET MVC

image

CSRF czyli Cross-Site Request Forgery jest to w skrócie zmuszenie przeglądarki ofiary do wykonania nieautoryzowanej akcji (za pomocą żądania HTTP). Ofiarą jest zalogowany do serwisu użytkownik. Celem takiego ataku może być podmiana danych w formularzu lub też wykonanie innej akcji np. stworzenie konta użytkownika z uprawnieniami admina. Wypadałoby się przed tym zabezpieczyć tworząc aplikacje webową. Na szczęście mechanizm zabezpieczeń otrzymujemy w ASP.NET MVC out of the box 🙂
Pokażmy to na przykładzie. Mamy kontroler eventów, który zawiera metody Edit – Get i Post.

Teraz wystarczy, że haker skłoni nas do wyświetlenia strony zawierającej formularz z auto submitem, przez niego spreparowany z wpisanymi wartościami, np. strona HTML może zawierać taki kawałek kodu:

W przykładzie tym została podmieniona data rozpoczęcia eventu. Nie jest to co prawda jakaś bardzo inwazyjna operacja, ale obrazuje działanie CSRF. W przypadku braku zabezpieczeń, data wybranego wydarzenia zostanie zaktualizowana. Z pomocą przychodzi nam atrybut [ValidateAntiForgeryToken], którym możemy udekorować naszą metodę Edit.

Ponadto w widoku musi się znaleźć taki fragment kodu:

powoduje to wygenerowanie ciasteczka i klucza, który jest ukryty w formie i wygląda tak:

W żądaniu POST ciasteczko jest przesyłane i za pomocą atrybutu [ValidateAntiForgeryToken] sprawdzana jest zgodność klucza. Gdy klucz nie będzie zgodny, wystąpi błąd. Dodatkowo w metodzie Edit można dodać jeszcze jedno zabezpieczenie, chodzi o binding.

Dzięki temu określamy jakie dane mogą zostać zapisane, ponadto w żądaniu sprawdzane są typy i wartości. Poprawność danych wskaże nam właściwość ModelState.IsValid.

Podsumowując, nie należy ignorować podatności CSRF i odpowiednio się przed nią zabezpieczyć. Na szczęście ASP.NET MVC robi to za nas 🙂