2014-09-12 16 views
7

से कौन सी नियंत्रक विधि को कॉल किया जाएगा, मेरे एपीआई को प्राधिकरण को संभालने के लिए मेरे पास कस्टम AuthorizationFilter कक्षा है। अब, मुझे विधियों में कुछ विशेषताओं को जोड़कर इसे बढ़ाने की आवश्यकता है जो केवल कुछ स्थितियों में में पढ़ा जाएगा।वेब एपीआई प्राधिकरण फ़िल्टर

मैं actionContext.ControllerContext से नियंत्रक प्राप्त कर सकते हैं लेकिन:

मुझे कैसे पता कर सकते हैं जो Controller विधि अपने कस्टम AuthorizeAttribute वर्ग के IsAuthorized विधि से बुलाया जाएगा? तो मैं प्रतिबिंब के साथ इसके गुण प्राप्त कर सकते हैं।

संपादित करें: जोड़ना अधिक info-

अगर मैं मिल एक फोन localhost/api/myapi/?id=4 जैसे मैं विधि है कि GetById(int id).

इस तरह मैं जांच कर सकता है की तरह नियंत्रक में निष्पादित किया जाएगा का वास्तविक नाम प्राप्त करना चाहते हैं यदि विधि में कोई कस्टम विशेषता है तो मुझे इसमें जोड़ा जाना चाहिए।

+0

इस कोशिश कर सकते हैं मैं अपने उत्तर हटा दिया गया के रूप में मैं अपने प्रश्न पढ़ने में भूलना । क्या आपने @ हेनरिक कुक जवाब देखा है? यह मेरे लिए काम करता है – wal

उत्तर

18

वेब एपीआई 2 में आप के साथ कार्रवाई नाम का उपयोग कर सकते हैं:

actionContext.ActionDescriptor.ActionName 
+6

क्या हो रहा है यह बताने के लिए कृपया अधिक जानकारी जोड़ें। – twoleggedhorse

+4

@twoleggedhorse और क्या समझाया जाना चाहिए? – wal

+0

आप वेब एपीआई में 'एक्शनकॉन्टेक्स्ट' में नहीं जोड़ सकते हैं। 1 लोगों के लिए पहले से ही बेस क्लास 'एपीकंट्रोलर' लागू कर रहे हैं, इसलिए आप नियंत्रक ('AuthorizeAttribute') पर एक और बेस क्लास लागू नहीं कर सकते हैं इस प्रकार कई लोगों ने जोड़ा है अधिक जानकारी के लिए –

1

आपने कोई कोड पोस्ट नहीं किया है, लेकिन आप HttpActionContext में रूटडेटा को नहीं देख सकते हैं?

public class MyAuthAttribute : AuthorizeAttribute 
{ 
    protected override bool IsAuthorized(HttpActionContext actionContext) 
    { 
     var routeData = actionContext.ControllerContext.RouteData; 

     //If you don't have an action name, I've assumed "index" is the default. 
     var actionName = routeData.Values.ContainsKey("id") ? routeData.Values["id"].ToString() : "Index"; 

     //you can then get the method via reflection... 
     var attribs = actionContext.ControllerContext.Controller.GetType() 
        .GetMethod(actionName, BindingFlags.Public | BindingFlags.Instance) 
        .GetCustomAttributes(); 

     //Do something... 

     return base.IsAuthorized(actionContext); 
    } 
} 
0

वैसे आप मिलीग्राम मार्ग डाटा से

// Gets controller name  
var controller = routeData.GetRequiredString("controller"); 

// Gets action name 
var action = routeData.GetRequiredString("action"); 
संबंधित मुद्दे