web-dev-qa-db-fra.com

Récupérez le nom d'action, le nom de contrôleur et le nom de zone et transmettez-le dans l'attribut de filtre d'action

J'utilise un AuthorizationFilter personnalisé, comme suit:

public class ActionAuthorizeAttribute : AuthorizeAttribute {

protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) {

        if(!httpContext.User.Identity.IsAuthenticated)
            return false;

        if(IsUserExcluded())
            return false;
        else
            return IsRoleAuthorize(httpContext);
    }
}

J'utilise ce filtre en haut de chaque action que j'ai et, pour le contrôle Est autorisé, j'ai besoin d'un nom d'action, d'un nom de contrôleur et d'un nom de zone. Donc, y a-t-il un moyen d’obtenir ces noms dans la méthode AuthorizeCore() comme use System.Web.HttpContextBase? Si la réponse est Non, comment puis-je obtenir ces noms et les transmettre à l'attribut, de toute évidence, je ne veux pas ajouter chaque nom manuellement, mais plutôt quelque chose commeViewContext.RouteData.Values["Controller"] dans les contrôleurs:

[ActionAuthorize(actionName=Action, controller=ControllerName, area=AreaName)]
public ActionResult Index() {
    return View();
}

Quelqu'un en a-t-il une idée?

31
Saeid

Vous pouvez les récupérer à partir de RouteData:

protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
{
    var rd = httpContext.Request.RequestContext.RouteData;
    string currentAction = rd.GetRequiredString("action");
    string currentController = rd.GetRequiredString("controller");
    string currentArea = rd.Values["area"] as string;

    ...

}
80
Darin Dimitrov

Faites face au même problème il y a un instant et ma solution est la suivante:

  1. Définissez 2 attributs dans votre classe ActionAuthorizeAttribute, par exemple.

    public string ControllerName {get;set;}
    public string ActionName {get;set;}
    
  2. Tout en annotant votre action du contrôleur, spécifiez-les, par exemple.

    [ActionAuthorize(Roles="Admin", ContollerName="ControllerName",ActionName="ActionName")]**
    public ActionResult Disable(int id)
    {
     ...
    }
    
1
Mukhtiar Zamin

Obtenir la zone ne fonctionnera pas si vous utilisez un filtre personnalisé Le prochain fonctionnera pour obtenir une zone

filterContext.RouteData.DataTokens["area"]
0
Eduardo Chávez