Question

Ma classe Controller est décorée avec un AuthorizeAttribute pour protéger les actions:

[Authorize(Roles = "User Level 2")]
public class BuyController : Controller
{
    ...
}

Chaque fois qu'une action est invoquée mais que l'utilisateur n'est pas au moins dans le rôle "Utilisateur niveau 2" il est automatiquement redirigé vers la page de connexion avec une URL comme celle-ci:

http: // localhost: 1436 / Account / Login? ReturnUrl =% 2fBuy

Si l'utilisateur est déjà connecté mais ne dispose pas du niveau de sécurité adéquat, il ne s'agit pas d'un comportement optimal! Il serait plus logique d'afficher une page informant l'utilisateur du niveau manquant au lieu d'afficher la page de connexion.

Que puis-je faire pour personnaliser ce comportement? Est-il possible de passer le niveau d'utilisateur requis à l'action de connexion d'une manière ou d'une autre?

Était-ce utile?

La solution

Vous pouvez créer votre propre attribut authorize comme suit:

public class ClubAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
  base.OnAuthorization(filterContext);
  if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult)
  {
    filterContext.Result = new RedirectToRouteResult(
      new RouteValueDictionary {
      { "clubShortName", filterContext.RouteData.Values[ "clubShortName" ] },
      { "controller", "Account" },
      { "action", "Login" },
      { "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
    });
  }
}
}

Je me suis servi de cela pour rediriger mes activités vers un club spécifique d'un site d'adhésion de club que je construis. Vous pouvez l'adapter à vos besoins. En passant, dans mon cas, je redirige vers la page de connexion, mais je vérifie que l'utilisateur est autorisé et, le cas échéant, affiche un message indiquant qu'il ne dispose pas des autorisations appropriées. Nul doute que vous pourriez aussi ajouter quelque chose à ViewData ou à TempData à afficher sur la page, mais je n'ai pas essayé cela

MODIFIER AuthorizationContext.Cancel n'existe plus dans RC. "filterContext.Result est HttpUnauthorizedResult". semble être suffisant: Qu'est-il arrivé à filterContext.Cancel ( ASP.NET MVC)

Autres conseils

Le temps a passé depuis la dernière réponse.

Depuis 2009, de nombreux progrès ont été réalisés dans le domaine des autorisations. En particulier, OASIS (ceux derrière SAML) ont normalisé XACML, le langage de balisage de contrôle d’accès eXtensible.

XACML donne aux développeurs:

  • un modèle d'utilisation
  • une architecture
  • un langage de politique d'autorisation flexible

XACML est conforme au contrôle d’accès basé sur les attributs, que le NIST recommande d’adopter de nos jours.

Consultez cette answer pour plus de détails.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top