Zabezpieczenie przed niepowołanym dostępem

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).

/* 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);
}
/* 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 :)

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 ?

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.

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ć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1