Zabezpieczenie przed niepowołanym dostępem

Zabezpieczenie przed niepowołanym dostępem
  • Rejestracja: dni
  • Ostatnio: dni
0

Jak najlepiej powinno się zabezpieczyć treści przed niepowołanym dostępem? Posłużę się przykładem sklepu internetowego. Każdy użytkownik ma jakieś swoje zamówienia, do których podglądu uprawniony jest tylko on sam (po zalogowaniu).

Kopiuj
/* akcja kontrolera */
[Authorize]
public ActionResult Details(int? id)
{
            if (id == null)
                return HttpNotFound();

           /* pobieram view model dla szczegołów zamówienia o podanym ID */
            var model = orderService.GetOrderDetailsViewModel((int)id);

           /* obecne rozwiązanie przy braku dostępu zwróci domyślną instancję view modelu, czyli id == 0 */
            if (model.OrderId == 0)
                return HttpNotFound();
            
            return View(model);
}
Kopiuj
/* metoda serwisu  */
public OrderDetailsViewModel GetOrderDetailsViewModel(int orderId)
 {
            var order = context.Orders.SingleOrDefault(o => o.Id == orderId);
            var customer = customerService.GetCurrentCustomer();

           /* jeżeli id klienta różne od id klienta, do którego należy zamówienie, to zwracam nową instancję klasy view modelu */
            if (order.CustomerId != customer.Id)
                return new OrderDetailsViewModel();
          
            var model = Mapper.Map<OrderDetailsViewModel>(order);

            return model;
}

Dodałem polskie komentarze, aby sprecyzować zagadnienie, z którym mam problem.
Innym moim pomysłem było po prostu dodanie do view modelu właściwość (boolean), która będzie zawierać informację, czy przyznano dostęp (true/false). Wtedy zamiast wartości OrderId (czy != 0) sprawdzałbym tego bool'a.

Jak powinno wyglądać sprawdzenie tego, czy klient wysyłający żądanie przez akcję kontrolera ma dostęp do zamówienia o zadanym ID?
Jeżeli przemielimy żądanie w serwisie i użytkownik nie będzie miał dostępu, to co zwrócić do kontrolera?
Czy taki kod ma ogólnie sens i można go uznać za poprawny?

Będę wdzięczny za wszelkie konstruktywne uwagi :)

E9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 395
1

Zrób sobie jakiś serwis autoryzacyjny dla zamówień i w nim sprawdzaj co potrzebujesz. Potem możesz go użyć w swoim własnym atrybucie lub innym serwisie. Gdy autoryzacja nie przechodzi przekieruj usera na jakąś stronę błędu czy coś w tym rodzaju. Zwrócenie pustego modelu jest bez sensu bo co się wtedy stanie na widoku ? Jaką informacje otrzyma user ?

  • Rejestracja: dni
  • Ostatnio: dni
0

W moim zamyśle pusty view model ma defaultowo id zamówienia 0. W kontrolerze sprawdzam czy id różne 0. Jeśli tak, to znaczy, że otrzymaliśmy właściwy view model. Jeśli id równe 0 (pusty vm) to zwracam HttpNotFound.

E9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 395
0

Spoko rozumiem, ale czy nie lepiej mieć metodę która odpowie na pytanie IsAuthorized i kiedy zwórci false to zwracać np. unauthorized (401) ? Kiedy dojdzie nowe uprawnienie do produktów będziesz musiał w tym kontrolerze znowu sprawdzić czy np. PreviousOrders.Count > 2. Takie sprawdzanie warto robić w dedykowanej do tego klasie, ponieważ kontroler sam w sobie nie powinien zawierać logiki, a dwa łatwiej będzie to testować.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.