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