17

मैंने दो वर्ग बनाए हैं जो AuthorizeAttribute लागू करते हैं।एक्शन फ़िल्टर निष्पादन आदेश

एक विश्व स्तर पर प्रयोग किया जाता है, और मैं Global.asax.cs पर सेट:

filters.Add(new FirstAuthorizeAttribute() { Order = 0 }); 

अन्य SecondAuthorizeAttribute कहा जाता है और यह केवल कुछ कार्रवाई के तरीकों में प्रयोग किया जाता है, और मैं में विशेषता के रूप में इसका इस्तेमाल करते हैं मैं चाहता हूँ कि तरीके।

[HttpGet] 
    [SecondAuthorize] 
    public ActionResult LogOut() 
    { 
     FormsAuthentication.SignOut(); 
     Session.Clear(); 
     Session.Abandon(); 
     return Redirect(Url.Content("~/")); 
    } 

समस्या यह है कि SecondAuthorizeAttribute हमेशा FirstAuthorizeAttribute से पहले निष्पादित है, और मैं पहली बार निष्पादित करने के लिए यह एक जरूरत है। आदेश उपयोगी नहीं है, मैं यह कैसे कर सकता हूं?

उत्तर

11

यह एक लंबा शॉट है, लेकिन क्या आपने अपने FirstAuthorizeAttribute के लिए वैश्विक और प्रथम मानों का उपयोग करने का प्रयास किया है?

http://msdn.microsoft.com/en-us/library/system.web.mvc.filterscope(v=vs.98).aspx

http://blog.rajsoftware.com/post/2011/05/14/MVC3-Filter-Ordering.aspx

+0

धन्यवाद चलेंगे, मैं इसे आज रात की कोशिश करेंगे। – vtortola

+3

कृपया संबंधित सामग्री को उत्तर में लिंक से कॉपी करने पर विचार करें। – BartoszKP

3

आदेश global.asax.cs फ़ाइल में काम नहीं कर रहा है। यदि आवश्यकता है तो गोटो नियंत्रक या कार्य विधि और दें। पूर्व: -

[secondAttribute (क्रम = 1)] [firstAttribute (क्रम = 2)]

HomeController: नियंत्रक

या

public ActionResult सूचकांक()

15

इस समय @ हेक्टरकोरिया के जवाब में लिंक मृत है, यहां सामग्री को पुनर्प्राप्त किया गया है और वर्तमान Google कैश से सारांशित किया गया है (यदि यह भी जाता है):

फिल्टर इस क्रम में निष्पादित करें:

  • प्राधिकरण फिल्टर
  • कार्रवाई फिल्टर
  • रिस्पांस/परिणाम फिल्टर
  • अपवाद फिल्टर

प्रत्येक फ़िल्टर में, आप आदेश संपत्ति निर्दिष्ट कर सकता है । (सभी फ़िल्टर अमूर्त वर्ग फ़िल्टर एट्रिब्यूट से व्युत्पन्न होते हैं, और इस वर्ग में ऑर्डर प्रॉपर्टी है)। यह संपत्ति सुनिश्चित करेगी कि फ़िल्टर एक विशिष्ट आदेश में चलता है।

जैसे:

[AuthorizationFilterA(Order=2)] 
[AuthorizationFilterB(Order=1)] 
public ActionResult Index() 
{   
    return View(); 
} 

वहाँ भी है FilterScope और डिफ़ॉल्ट रूप से, सबसे कम गुंजाइश के साथ फिल्टर पहले तब चलता है जब आदेश में एक ही है (या निर्दिष्ट नहीं):

namespace System.Web.Mvc { 
    public enum FilterScope { 
     First = 0, 
     Global = 10, 
     Controller = 20, 
     Action = 30, 
     Last = 100, 
    } 
} 

यदि कोई आदेश निर्दिष्ट है, ऑर्डर मान -1 है (पहला, अंतिम नहीं)।

नियंत्रकों खुद को फिल्टर किया जा सकता है और आदेश के साथ Int32.MinValue

+2

ध्यान रखें कि अपवाद फ़िल्टर रिवर्स ऑर्डर में चलते हैं (बेशक वे करते हैं!), इसलिए उन लोगों के लिए, उच्चतम स्कोप वाला फ़िल्टर पहले चलता है – levelnis

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