27

में इसे पारित मैं निम्नलिखित की तरह एक कस्टम AuthorizationFilter का उपयोग करें:ActionName, ControllerName और AreaName जाओ और ActionFilter गुण

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

मैं प्रत्येक कार्य मेरे पास है के शीर्ष पर इस फिल्टर का उपयोग, और के लिए चेक के लिए अधिकृत है, कार्रवाई का नाम, नियंत्रक का नाम, और क्षेत्र का नाम चाहिए। तो AuthorizeCore() विधि जैसे System.Web.HttpContextBase पर इस नाम को पाने का कोई तरीका है? यदि जवाब नहीं है तो मैं इस नाम कैसे मिलता है और उसका श्रेय देना, स्पष्ट रूप से मैं एक नाम नियंत्रकों में वास्तव में ViewContext.RouteData.Values["Controller"] की तरह कुछ है, हाथ से जोड़ने के लिए नहीं करना चाहती पारित कर सकते हैं:

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

किसी भी एक किसी भी विचार है इसके बारे में?

उत्तर

71

आप उन्हें 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

"आप उन्हें RouteData से ला नहीं सकता है" काम करेंगे नहीं है एक अच्छा जवाब ** अब ** इसे संपादित किया गया था, मैं वापस आऊंगा। – gdoron

+11

यह सिर्फ एएसपी.नेट एमवीसी 4 में हो सकता है, लेकिन क्षेत्र rd.DataTokens ["क्षेत्र"] में पाया जाता है। –

+0

आपको लाइन var rd = httpContext.Request.RequestContext.RouteData को बदलना चाहिए; var rd = HttpContext.Current.Request.RequestContext.RouteData; एक पैरामीटर से मानक एक का उपयोग करने के लिए बेहतर :) –

1

चेहरा ही समस्या का बस एक पल पहले और मेरे समाधान है:

  1. अपने ActionAuthorizeAttribute वर्ग उदा में 2 विशेषताओं को परिभाषित करें

    public string ControllerName {get;set;} 
    public string ActionName {get;set;} 
    
  2. व्याख्या करते हुए नियंत्रक की अपनी कार्रवाई उन्हें जैसे निर्दिष्ट

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

क्षेत्र हो रही है, तो आप एक कस्टम फ़िल्टर पर हैं काम नहीं करेगा अगले एक क्षेत्र पाने के लिए

filterContext.RouteData.DataTokens["area"]