Comment utiliser AuthorizeAttribute personnalisé pour le contrôleur en utilisant la valeur du paramètre?
-
26-09-2019 - |
Question
Je suis en train d'assurer une action de contrôleur pour empêcher un utilisateur d'accéder à une entité qu'ils n'ont pas accès. Je suis en mesure de le faire avec le code suivant.
public ActionResult Entity(string entityCode)
{
if (CurrentUser.VerifyEntityPermission(entityCode))
{
//populate viewModel...
return View(viewModel);
}
return RedirectToAction("NoAccessToEntity", "Error");
}
Je voudrais être en mesure d'ajouter un attribut à l'action du contrôleur lui-même. Afin de valider l'accès à l'entité, je dois voir quelle valeur a été transmise au contrôleur et quelles entités l'utilisateur a accès. Est-ce possible?
[EntityAuthRequired]
public ActionResult Entity(string entityCode)
{
//populate viewModel...
return View(viewModel);
}
La solution
Quelque chose comme cela pourrait vous aider sur votre chemin. Bien que vous pouvez ajouter des propriétés supplémentaires à votre attribut pour vous permettre de spécifier votre paramètre entitycode sur chaque action, plutôt que de coder en dur il.
public class EntityAuthRequired : FilterAttribute, IAuthorizationFilter
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
//Make sure that this is not NULL before assigning value as string...
var entityCode = filterContext.RouteData.Values["entityCode"] as string;
// do your logic...
if (!allowed)
filterContext.Result = new HttpUnauthorizedResult();
}
}
En outre, si le entityCode
est pas dans votre RouteData, vous pouvez utiliser filterContext.RequestContext.HttpContext.Request
pour regarder les données POST.