2011-07-12 8 views
14

मैंने एक कस्टम AuthorizeAttribute बनाया है जो HTTP हेडर के अंदर भेजे गए कुछ OAuth प्रमाण-पत्रों को सत्यापित करता है। मैं यह पुष्टि करने के लिए इनमें से कुछ प्रमाण-पत्रों का उपयोग कर रहा हूं कि कौन अनुरोध कर रहा है। एक बार जब मैं AuthorizeAttribute में इस जानकारी को पार्स करता हूं तो इसे पास करने का कोई तरीका है ताकि डेटा नियंत्रक के आवृत्ति चर को असाइन किया जा सके? फिर मेरे नियंत्रक में कहीं भी मेरे पास अनुरोध करने वाली पार्टी की आईडी होगी।मैं AuthorizeAttribute से नियंत्रक को डेटा कैसे पास कर सकता हूं?

उत्तर

12

मूल जवाब

आप

_yourVariable = HttpContext.Items["test"]; 

आप शायद करना चाहते हैं कि आपके द्वारा कार्रवाई में अपने फ़िल्टर

filterContext.HttpContext.Items["test"] = "foo"; 

और फिर इस में ऐसा करने में सक्षम होना चाहिए "test" से अधिक अनन्य कुंजी का उपयोग करें, लेकिन यह विचार है।

संपादित इसके दो कारण हम नहीं बल्कि निर्माता से कार्रवाई में ऐसा कर रहे हैं:

  1. A Controller's constructor fires before OnAuthorization, तो आइटम अभी तक सेट नहीं किया जाएगा।
  2. HttpContext अभी तक नियंत्रक के निर्माता में सेट नहीं है।

वैकल्पिक समाधान

  1. OAuthController में एक नया OAuthController : Controller
  2. अवहेलना OnAuthorization
  3. एक protected क्षेत्र सेट OAuthController.OnAuthorization
  4. में अपने फिल्टर से तर्क ले जाएँ (यानी, protected object myAuthData) बनाएं
  5. अपने अन्य नियंत्रकों को से Controller
  6. पर अपने अन्य नियंत्रक myAuthData तक पहुंच सकते हैं।
+0

हम्म ... जब मैंने इस परिवर्तक को सेट करने के लिए अपने नियंत्रक को एक कन्स्ट्रक्टर जोड़ा, तो यह मेरे सभी मॉडल बाइंडिंग (एक त्रुटि फेंकता) तोड़ दिया। कोई अन्य विचार? – BigOmega

+0

@ रयान मैं मूल रूप से यह मेरे जवाब में नोट किया था लेकिन इसे हटा दिया। शायद मुझे इसे वापस रखना चाहिए। वैसे भी, एक नियंत्रक का कन्स्ट्रक्टर ** ** प्राधिकरण से पहले ** आग लगाता है, इसलिए आइटम अभी तक सेट नहीं किया जाएगा। इसके अलावा, नियंत्रक के पास अभी तक एक HttpContext भी नहीं है। आपको इसे अपने कार्य में करने की ज़रूरत है। –

+0

@Ryan एक विकल्प 'OAuthController: Controller' बनाने के लिए होगा, क्या मैंने लिंक किए गए पोस्ट में उल्लिखित 'ऑन-प्राधिकरण' को ओवरराइड किया है, क्या इसे 'संरक्षित' सदस्य सेट किया गया है, और आपके अन्य नियंत्रक इसे प्राप्त करते हैं। –

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

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