2012-07-15 16 views
7

मैंने AuthorizeAttribute कक्षा से विरासत में एमवीसी 4 में अपना स्वयं का कस्टम प्राधिकरण विशेषता लागू की है। मेरे पास कस्टम ActionFilterAttribute भी है। ये दोनों ठीक काम करते हैं हालांकि समस्या उन्हें आदेश देने में निहित है। मुझे कस्टम प्राधिकरण फ़िल्टर से पहले चलाने के लिए कस्टम एक्शन फ़िल्टर की आवश्यकता है।प्रमाणीकरण से पहले एक्शन फ़िल्टर निष्पादित करने के लिए कैसे करें फ़िल्टर एमवीसी 4

मैंने गुणों के लिए Order संपत्ति का उपयोग करने का प्रयास किया है, लेकिन जैसा कि मैं इसे समझता हूं, प्राधिकरण फ़िल्टर हमेशा एक्शन फ़िल्टर से पहले चलेंगे।

क्या कोई जानता है कि प्राधिकरण फ़िल्टर से पहले क्रिया फ़िल्टर को निष्पादित करने के लिए कैसे मजबूर किया जाए ??

+0

प्राधिकरण फ़िल्टर जांचता है कि उपयोगकर्ता को अनुमति है या नहीं, तो अगर कोई नहीं है तो कुछ और जांच नहीं है। ऐसा लगता है जैसे आप कुछ अजीब कर रहे हैं। शायद समझाओ कि आप उन्हें स्वैप क्यों करना चाहते हैं। –

+0

वैसे एक्शन फ़िल्टर जांचता है कि किसी विशेष उपयोगकर्ता के पास अस्थायी पासवर्ड है या नहीं, इसलिए मैं उन्हें "पासवर्ड बदलें" पृष्ठ पर रीडायरेक्ट करने के लिए रीडायरेक्ट करना चाहता हूं और "अनधिकृत" कहता हूं। उम्मीद है कि समझ में आता है ... – davey1990

+1

उस मामले में ऐसा लगता है कि आप चाहते हैं कि अस्थायी पासवर्ड वाले लोग अभी भी प्राधिकरण जांच में असफल हो जाएं, लेकिन अगर आपके पास एक अस्थायी पासवर्ड है, तो बस अपने "अनधिकृत" पृष्ठ में जांचना चाहते हैं, और " उस मामले में पासवर्ड बदलें "पृष्ठ। वैकल्पिक रूप से, आप इसे लॉगिन पर पकड़ सकते हैं और उन्हें लॉगिन करने की अनुमति देने से पहले अपना पासवर्ड बदलने के लिए मजबूर कर सकते हैं। तो आपको चिंता करने की ज़रूरत नहीं है। –

उत्तर

10

जब आप स्रोत कोड (http://aspnetwebstack.codeplex.com/ पर उपलब्ध) देखते हैं तो आप देखते हैं कि मानक फ़िल्टर कक्षाओं के साथ यह संभव नहीं है। IAuthorizationFilter कार्यान्वयन हमेशा IActionFilter कार्यान्वयन से पहले निष्पादित किए जाते हैं। ऐसा इसलिए है क्योंकि प्राधिकरण फ़िल्टर परिणाम लौटाते समय एक्शन फ़िल्टर नहीं चलेंगे।

इस हल करने के लिए आप अपने खुद के ControllerActionInvoker वंशज वर्ग बना सकते हैं और InvokeAction विधि ओवरराइड कर सकते हैं:

public class MyControllerActionInvoker : ControllerActionInvoker 
{ 
    public override bool InvokeAction(ControllerContext controllerContext, string actionName) 
    { 
     // Your initialization code here 
     try 
     { 
      return base.InvokeAction(controllerContext, actionName); 
     } 
     finally 
     { 
      // Your finalization code here 
     } 
    } 
} 

आप ControllerFactory वर्ग एक कस्टम में अपने नियंत्रकों में अपना कस्टम MyControllerActionInvoker वर्ग इंजेक्षन करने की जरूरत है:

public class MyControllerFactory : DefaultControllerFactory 
{ 
    private readonly MyControllerActionInvoker actionInvoker = new MyControllerActionInvoker(); 

    /// <summary> 
    /// Retrieves the controller instance for the specified request context and controller type. 
    /// </summary> 
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     var controllerInstance = base.GetControllerInstance(requestContext, controllerType); 

     if (controllerInstance != null) 
     { 
      var typedController = controllerInstance as Controller; 
      if (typedController != null) 
      { 
       typedController.ActionInvoker = this.actionInvoker; 
      } 
     } 

     return controllerInstance; 
    } 
} 

और निश्चित रूप से अब आपको एमवीसी ढांचे के साथ अपना खुद का MyControllerFactory पंजीकृत करना होगा। जहां आप भी अपने मार्गों को पंजीकृत आपको यह करना चाहिए:

var controllerFactory = new MyControllerFactory(); 
ControllerBuilder.Current.SetControllerFactory(controllerFactory); 

इस कार्यान्वयन ठीक काम करता है यहाँ।

संबंधित मुद्दे