2009-08-22 11 views
9

मुझे आश्चर्य हुआ कि अगर मैं एएसपी.नेट एमवीसी में डिफ़ॉल्ट [अधिकृत] व्यवहार को ओवरराइड कर सकता हूं। मुझे पता है कि मैं एक नया एक्शन फ़िल्टर बना सकता हूं, अपनी खुद की विशेषता बना सकता हूं और आगे; मुझे केवल दिलचस्पी है अगर मैं आसानी से [प्राधिकरण] व्यवहार बदल सकता हूं और अपने कामकाज को अपने कोड से बदल सकता हूं?क्या एएसपी.नेट एमवीसी में [प्राधिकरण] के डिफ़ॉल्ट व्यवहार को ओवरराइड करना संभव है?

संपादित करें: दोस्तों और लड़कियों। मैं आपके इनपुट की सराहना करता हूं लेकिन जैसा कि मैंने लिखा है, मैं एक नया [XYZAuthorize] विशेषता पेश करने की तलाश में हूं। मुझे पता है कि यह कैसे करें। मैं [प्राधिकरण] नोटेशन रखना चाहता हूं लेकिन यह बदलता है कि यह कैसे काम करता है।

+7

आप विशेषता के "अधिकृत" नाम को क्यों रखना चाहते हैं, और इसके व्यवहार को बदलना चाहते हैं? यह करना एक बुरी बात है। लोग, जब वे देखते हैं [अधिकृत] वे उम्मीद करते हैं कि यह क्या करेगा। यदि आप इसे बदलते हैं, तो अपना कोड पढ़ना बहुत कठिन होगा। भविष्य में भी आपके लिए। –

+3

मैं असहमत हूं; यदि आप इसका तर्क देते हैं, तो कोई ऑपरेटर या विधि ओवरलोडिंग/ओवरराइडिंग गलत होगी। – Alex

+5

@Alex: मैं असहमत हूं। ऑपरेटर अधिभार एक अच्छी बात है। इसका दुरुपयोग करना एक बुरी बात है। सामान्य उदाहरण: आपके पास वेक्टर क्लास है, आप "+" ऑपरेटर बनाते हैं। यह स्पष्ट है कि यह क्या करेगा। लेकिन "*" ऑपरेटर के बारे में क्या? यह करना एक बुरी बात है, क्या यह एक क्रॉस उत्पाद या डॉट उत्पाद है? या एक और प्रकार का कस्टम उत्पाद? तो: ओवरलोडिंग अच्छा है, लेकिन जब आप सम्मेलन मुखौटा करते हैं तो यह बहुत बुरा होता है। –

उत्तर

6

हाँ, AuthorizeAttribute के लिए MSDN डॉक्स पर एक नज़र डालें: http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx

असल में, आप ऑन-प्राधिकरण() विधि को ओवरराइड कर सकते हैं और व्यवहार को कस्टमाइज़ कर सकते हैं। विशेषता पर अन्य वर्चुअल विधियां भी हैं।

संपादित करें: जैसा कि ब्रूनो ने बताया, आप AuthorizeCore() विधि को ओवरराइड कर सकते हैं। मुख्य अंतर यह है कि AuthorizeCore() एक HttpContextBase लेता है, जबकि ऑनअधिकरण() एक प्राधिकरण कॉन्टेक्स्ट लेता है। AuthorizationContext का एक उदाहरण आपको अधिक जानकारी प्रदान करता है, जैसे नियंत्रक, RequestContext और रूटडेटा। यह आपको एक ActionResult निर्दिष्ट करने देता है।

AuthorizeCore() उस जानकारी में अधिक प्रतिबंधित है जिसके साथ आप पहुंच सकते हैं और परिणामस्वरूप आप वापस आ सकते हैं, लेकिन यदि आपको कैश किए गए डेटा को अधिकृत करने की आवश्यकता है, तो आपके तर्क को उस मामले को संभालने की आवश्यकता है जहां आपके पास कोई भी नहीं है वह अतिरिक्त डेटा (चूंकि अनुरोध एमवीसी पाइपलाइन के माध्यम से अनुरोध किए जाने से पहले डेटा को कैश से परोसा जाता है)।

हमेशा की तरह, आपको अपने परिदृश्य और उनके बीच उपलब्ध टूल और व्यापार-समझ को समझने की आवश्यकता है।

+1

AuthorizeAttribute में ऑन-प्राधिकृत विधि नहीं है। क्या आपका मतलब प्राधिकरण() है? वैसे भी, आपको इसे तब तक नहीं बदला जाना चाहिए, जब तक कि आप कैशिंग को कार्यान्वित करते समय कुछ सिरदर्द नहीं चाहते हैं, क्योंकि यह एक विधि (ऑनअधिकृतता) है जो इससे संबंधित है। –

9

आप AuthorizeAttribute फ़िल्टर को उपclass कर सकते हैं और इसके अंदर अपना तर्क डाल सकते हैं।

चलो एक उदाहरण देखें। मान लीजिए कि आप हमेशा स्थानीय कनेक्शन को अधिकृत करना चाहते हैं। हालांकि, अगर यह रिमोट कनेक्शन है, तो आप सामान्य प्रमाणीकरण तर्क रखना चाहते हैं।

आप की तरह कुछ कर सकता है:

public class LocalPermittedAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
      return (httpContext.Request.IsLocal || base.AuthorizeCore(httpContext))); 
     } 
} 

या आप हमेशा एक निश्चित दूरस्थ पता (अपना मशीन, उदाहरण के लिए) को अधिकृत कर सकता है।

यही है!

संपादित करें: उल्लेख करना भूल गया, तो आप इसे एक ही का उपयोग के रूप में आप AuthorizeAttribute फिल्टर का प्रयोग करेंगे होगा:

class MyController : Controller 
{ 
    [LocalPermittedAuthorize] 
    public ActionResult Fire() 
    { 
     Missile.Fire(Datetime.Now); 
    } 
} 
2

मैं केवल 2 तरीके देखें: AuthorizeAttribute.OnAuthorization विधि अधिभावी या खरोंच से अपनी खुद की अधिकृत विशेषता का निर्माण।

1) बहुत आसान:

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     /// your behavior here 
    } 
} 

2) आसान भी - बस ASP.NET MVC स्रोत को देखो, AuthorizeAttribute.cs फ़ाइल

+1

पर आपको स्क्रैच से प्राधिकरण विशेषता बनाने से बचना चाहिए यदि आप सिरदर्द नहीं चाहते हैं कैशिंग लागू करेगा ... एएसपी.नेट एमवीसी से प्राधिकृत विशेषता पहले से ही इस पहलू से संबंधित है। –

1

ऐसा लगता है कि आप सामान्य रूप से कस्टम फ़िल्टर को कार्यान्वित कर सकते हैं (और यदि आप चाहें तो AuthorizeAttribute का उत्तराधिकारी प्राप्त कर सकते हैं), और उसके बाद ControllerActionInvoker प्राप्त करने वाले नए एक्शन इनवॉकर बनाएं और GetFilters को ओवरराइड करें।GetFilters में, आप फ़िल्टर की सूची प्राप्त करने के लिए base.GetFilters() पर कॉल करें, प्राधिकरण फ़िल्टर के माध्यम से पुनरावृत्त करें और अपने कस्टम फ़िल्टर पर कॉल के साथ AuthorizeFilter पर कॉल को प्रतिस्थापित करें।

एक और संभावित तरीका कस्टम सदस्यता और भूमिका प्रदाताओं को लागू करना है, जो आप करने की कोशिश कर रहे हैं उसके आधार पर।

+0

किसी साधारण प्राधिकरण फ़िल्टर के लिए किसी को कस्टम एक्शन इनवॉकर की आवश्यकता क्यों होगी? –

+0

@ ब्रूनो: क्योंकि नए फ्रेम बनाने के लिए, फ्रेमवर्क फ़िल्टर को स्वयं के साथ बदलने का कोई अन्य तरीका नहीं है। – svinto

+0

लेकिन ... क्यों फ्रेमवर्क फ़िल्टर को प्रतिस्थापित करना चाहते हैं? प्रश्न पर मेरी टिप्पणी देखें। यह करने के लिए एक बेवकूफ बात है। –

4

अपनी खुद की भूमिका प्रदाता लागू करें और इसका उपयोग करने के लिए अपने ऐप को सेट करें। फिर प्राधिकृत विशेषता आपके एथोरिज़ेशन कोड का सम्मान करेगी।

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