27

bunu pass:ActionName, ControllerName ve AreaName ve bende aşağıdakilerden gibi özel bir AuthorizationFilter kullanmak ActionFilter Özelliği

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

Ben var her eyleme üstündeki bu filtreyi kullanın ve çek yetkilidir için, Eylem Adı, Denetleyici Adı ve Alan Adı gerekir. Yani bu isimleri System.Web.HttpContextBase kullanımı gibi AuthorizeCore() yönteminde almak için herhangi bir yolu var mı? Cevap sonra yok ise nasıl bu isimleri almak ve açıkçası ben kontrolörleri aslında bir şey ViewContext.RouteData.Values["Controller"] gibi elle her isim eklemek istemiyorum, atfetme geçirebilirsiniz:

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

herhangi birinin herhangi bir fikri var mı hakkında?

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; 

    ... 

} 

cevap

71

Sen RouteData dan alamadan

  1. mesela senin ActionAuthorizeAttribute sınıfında 2 niteliklerini tanımlama

    public string ControllerName {get;set;} 
    public string ActionName {get;set;} 
    
  2. kumandanın eylem mesela bunları belirtmek annotating ederken Özel bir filtre üzerinde ise çalışmaz alanı alınıyor

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

"Sen RouteData dan alamadan" bir alan elde etmek için çalışacak iyi bir cevap. ** Şimdi ** düzenlendi, ben geri döneceğim. – gdoron

+11

Bu sadece ASP.NET MVC 4'te olabilir, ancak alan rd.DataTokens ["alan"] 'da bulunur. –

+0

Satır var rd = httpContext.Request.RequestContext.RouteData; için var rd = HttpContext.Current.Request.RequestContext.RouteData; Bir parametreden daha standart olanı kullanmak daha iyidir :) –

1

Face sadece bir an önce aynı sorun ve benim çözümdür:

0

sonraki değil mi

filterContext.RouteData.DataTokens["area"] 
İlgili konular