Ecco la mia soluzione, basata sulla risposta di eu-ge-ne. Il mio reindirizza correttamente l'utente alla pagina di accesso se non ha effettuato l'accesso, ma a una pagina di accesso negato se ha effettuato l'accesso ma non è autorizzato a visualizzare tale pagina.
[AccessDeniedAuthorize(Roles="SuperAdmin")]
public class SuperAdminController : Controller
AccessDeniedAuthorizeAttribute.cs:
public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.Result = new RedirectResult("~/Account/Logon");
return;
}
if (filterContext.Result is HttpUnauthorizedResult)
{
filterContext.Result = new RedirectResult("~/Account/Denied");
}
}
}
AccountController.cs:
public ActionResult Denied()
{
return View();
}
Vista/account/Denied.cshtml: (sintassi Razor)
@{
ViewBag.Title = "Access Denied";
}
<h2>@ViewBag.Title</h2>
Sorry, but you don't have access to that page.
fonte
2011-01-19 18:22:41
Se l'utente è connesso e tenta di accedere alla pagina, verrà reindirizzato alla pagina AccessDenied. Buona. Ma, se l'utente non ha effettuato l'accesso, verrà reindirizzato alla pagina AccessDenied. Cattivo.In quella situazione, dovrebbero essere reindirizzati alla pagina di accesso. –
Se si desidera reindirizzare la pagina normalmente nel caso in cui l'utente non sia più in, dopo la chiamata al metodo base.OnAuthorization(), aggiungere un'istruzione if attorno al resto del codice che controlla se Threading.Thread.CurrentPrincipal. Identity.IsAuthenticated. In questo modo l'utente viene indirizzato alla pagina AccessDenied a meno che l'utente non sia autenticato ... nel qual caso eseguirà l'azione predefinita (reindirizzamento alla pagina di accesso) – Frinavale
dove viene inserita questa classe? nel controller? – Jay