Questo indica solitamente che l'accesso alla risorsa richiesta è vietato per qualche ragione e il server non può procedere altrimenti. Diversamente dallo stato 401 Unauthorized, che indica un accesso non autorizzato, le credenziali non servono e non permetterebbero comunque di visualizzare la pagina.
Per gestire questa situazione in ASP.NET MVC possiamo creare un helper personalizzato che deve soddisfare le seguenti condizioni:
- Deve essere facile e immediato da utilizzare
- Deve restituire al browser il codice di errore 403 insieme allo stato Forbidden
- Non deve effettuare un redirect ma la pagina deve rimanere la stessa
- Deve mostrare all'utente una view personalizzata
public class HttpForbiddenResult : HttpStatusCodeResult { public override void ExecuteResult(ControllerContext context) { base.ExecuteResult(context); // crea il ViewResult impostando anche i parametri ViewData e TempData ViewResult result = new ViewResult { ViewName = "AccessDenied", ViewData = context.Controller.ViewData, TempData = context.Controller.TempData }; result.ExecuteResult(context); } // richiama il costruttore base con il codice 403 public HttpForbiddenResult() : base(HttpStatusCode.Forbidden, "Forbidden") { } }
Ho creato quindi una view chiamata AccessDenied all'interno della cartella Shared, contenente un messaggio per gli utenti che visualizzeranno la pagina di errore:
@{ ViewBag.Title = "Access Denied"; } <h2>Access Denied</h2> <p>Sorry, the access to this page is denied.</p>
Per utilizzare l'helper appena creato saranno sufficienti le seguenti linee di codice:
public class HomeController : Controller { public ActionResult DoSomething(string taskName) { // accesso negato quando il parametro taskName è vuoto if (string.IsNullOrEmpty(taskName)) return new HttpForbiddenResult(); return View(); } }
Andando quindi con il browser alla URL del controller precedente senza il parametro taskName il risultato sarà questo:
Chiaramente con le opportune modifiche è possibile realizzare un helper per tutti i codici di errore HTTP che ci interessano!
No comments:
Post a Comment