Ottenere ActionName, ControllerName e AreaName e passare in ActionFilter Attributo

Io uso una custom AuthorizationFilter come le seguenti:

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);
    }
}

Io uso questo filtro all’inizio di ogni azione che ho, e per il controllo È Autorizzata, hanno bisogno di Azione Nome, il Nome del Controller, E il Nome dell’Area. Quindi non vi è alcun modo per ottenere questo i nomi in AuthorizeCore() metodo come utilizzare System.Web.HttpContextBase? se la risposta è No, allora come posso ottenere questo nome e pass per attributo, ovviamente non voglio aggiungere ogni nome, in realtà qualcosa di simileViewContext.RouteData.Values["Controller"] controller:

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

Se uno ha qualche idea?

InformationsquelleAutor Saeid | 2012-04-02



4 Replies
  1. 83

    Si potrebbe prendere dal 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;
    
        ...
    
    }
    • “Si potrebbe recuperare da loro l’RouteData” non È una buona risposta. Ora è stato modificato, cercherò di tornare.
    • Questo potrebbe essere solo in ASP.NET MVC 4, ma l’area si trova in rd.DataTokens[“area”].
    • Si dovrebbe modificare la riga var rd = httpContext.Richiesta.RequestContext.RouteData; var rd = HttpContext.Corrente.Richiesta.RequestContext.RouteData; meglio usare quello standard di un parametro 🙂
    • Preferirei non farlo. Che renderebbe il mio codice estremamente unit test ostile. Preferisco sempre lavorare con astrazioni. Non ricordo quando ho usato per ultimo HttpContext.Current nella mia carriera.
    • Il nome non sarà contenuta in Valori RouteValueDictionary. Piuttosto, saranno contenute nel DataTokens proprietà, in modo da ottenere l’area che si vorrebbe rd.DataTokens[“area”] come stringa
  2. 1

    Affrontano lo stesso problema appena un momento fa, e la mia soluzione è:

    1. Definire 2 attributi ActionAuthorizeAttribute classe ad esempio

      public string ControllerName {get;set;}
      public string ActionName {get;set;}
    2. Mentre l’annotazione azione del controller di specificare ad esempio

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

    Raggiungere la zona non funziona, se siete su un filtro personalizzato
    il prossimo sarà il lavoro per ottenere un’area

    filterContext.RouteData.DataTokens["area"]
  4. 0
    > namespace dene.kontroller {
    >     public class daAttribute: AuthorizeAttribute
    >     {
    >         private Entities db = new Entities();
    >         private readonly string[] allowedroles;
    >         public daAttribute(params string[] roles)
    >         {
    >             this.allowedroles = roles;
    >         }
    > 
    > 
    >         protected override bool AuthorizeCore(HttpContextBase httpContext)
    >         {
    >             bool authorize = false;
    >             foreach (var role in allowedroles)
    >             {
    >                 if (role == HttpContext.Current.User.Identity.Name)
    >                 {
    >                      
    >                     if (role!= null)
    >                     {
    >                         authorize = true;
    >                     }
    >                 }
    >                 
    > 
    >             }
    >             return authorize;
    >         }
    > 
    > 
    >         protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    >         {
    > 
    >             FormsAuthentication.SignOut();
    >             filterContext.Result = new HttpUnauthorizedResult();
    >         }
    > 
    >     } }

Lascia un commento