27

ich eine benutzerdefinierte AuthorizationFilter wie die Anhänger verwenden:Get Action, controller und areaname und gibt es in Action 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); 
    } 
} 

Ich benutze diese Filter am Anfang jeder Aktion, die ich habe, und für die Prüfung ist ermächtigt, benötige Aktionsname, Controller-Name und Bereichsname. Also gibt es eine Möglichkeit, diese Namen in AuthorizeCore() Methode wie Verwendung System.Web.HttpContextBase zu bekommen? Wenn die Antwort Nein ist dann, wie kann ich diesen Namen bekommen und gebe es zuzuschreiben, natürlich will ich nicht jeden Namen von Hand zu haben, tatsächlich so etwas wie ViewContext.RouteData.Values["Controller"] in Controller:

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

Hat jemand eine Ahnung, darüber?

Antwort

71

Sie konnten sie von der Routedata holen:

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

bekommen „Du sie von der Routedata holen konnte“ Ist das nicht eine gute Antwort. ** Jetzt ** wurde es bearbeitet, ich werde zurückkehren. – gdoron

+11

Dies könnte nur in ASP.NET MVC 4 sein, aber der Bereich befindet sich in rd.DataTokens ["Bereich"]. –

+0

Sie sollten die Zeile ändern var rd = httpContext.Request.RequestContext.RouteData; zu var rd = HttpContext.Current.Request.RequestContext.RouteData; besser, den Standard als einen Parameter zu verwenden :) –

1

Gesicht das gleiche Problem nur einen Augenblick vor und meine Lösung ist:

  1. definieren 2 Attribute in Ihrer ActionAuthorizeAttribute Klasse z.B.

    public string ControllerName {get;set;} 
    public string ActionName {get;set;} 
    
  2. Während Sie Ihre Aktion des Controllers kommentieren, geben Sie diese z.

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

den Bereich Erste wird nicht funktionieren, wenn Sie auf einem benutzerdefinierten Filter sind wird die nächste Arbeit über eine Fläche

filterContext.RouteData.DataTokens["area"]