Voici ma solution, basée sur la réponse d'eu-ge-ne. Le mien redirige correctement l'utilisateur vers la page de connexion s'il n'est pas connecté, mais vers une page Accès refusé s'il est connecté mais n'est pas autorisé à afficher cette page.
[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();
}
vues/compte/Denied.cshtml: (syntaxe Razor)
@{
ViewBag.Title = "Access Denied";
}
<h2>@ViewBag.Title</h2>
Sorry, but you don't have access to that page.
Si l'utilisateur est connecté et tente d'accéder à la page, il sera redirigé vers la page AccessDenied. Bien. Mais, si l'utilisateur n'est pas connecté, il sera redirigé vers la page AccessDenied. Mal.Dans ce cas, ils doivent être redirigés vers la page de connexion. –
Si vous souhaitez que la page redirige normalement dans le cas où l'utilisateur ne se trouve plus, après l'appel de la méthode base.OnAuthorization(), ajoutez une instruction if autour du reste du code qui vérifie si Threading.Thread.CurrentPrincipal. Identity.IsAuthenticated. De cette façon, l'utilisateur est dirigé vers la page AccessDenied à moins que l'utilisateur ne soit pas authentifié ... dans ce cas, il fera l'action par défaut (rediriger vers la page de connexion) – Frinavale
où cette classe est-elle placée? dans le contrôleur? – Jay