27

użyć niestandardowego AuthorizationFilter jak poniższych:Get ActionName, ControllerName i AreaName i przekazać go w ActionFilter Attribute

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

używam tego filtra na górze każdej akcji mam, a do odprawy jest upoważniony, potrzebna nazwa akcji, nazwa kontrolera i nazwa obszaru. Czy istnieje sposób na uzyskanie tych nazw w metodzie AuthorizeCore(), takiej jak użycie System.Web.HttpContextBase? jeśli odpowiedź brzmi nie, to jak mogę to imiona i przekazać go do atrybutu, oczywiście nie chcę, aby dodać każdą nazwę strony, faktycznie coś ViewContext.RouteData.Values["Controller"] w sterownikach:

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

Czy ktoś ma jakiś pomysł o tym?

Odpowiedz

71

Można pobrać je z 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; 

    ... 

} 
+1

„Można pobrać je z RouteData” Is not dobra odpowiedź. ** Teraz ** został zredagowany, powrócę. – gdoron

+11

Może to być tylko w ASP.NET MVC 4, ale obszar znajduje się w rd.DataTokens ["obszar"]. –

+0

Powinieneś zmienić wiersz var rd = httpContext.Request.RequestContext.RouteData; do var rd = HttpContext.Current.Request.RequestContext.RouteData; lepiej używać standardowego niż parametru :) –

1

twarzy ten sam problem przed chwilą i moje rozwiązanie to:

  1. 2 Definiowanie atrybutów w klasie ActionAuthorizeAttribute przykład

    public string ControllerName {get;set;} 
    public string ActionName {get;set;} 
    
  2. Podczas opisywania czynności kontrolera określ je, np.

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

Pierwsze obszar nie będzie działać, jeśli jesteś na filtrze niestandardowym następny będzie działać, aby uzyskać powierzchnię

filterContext.RouteData.DataTokens["area"]