2013-05-23 6 views
12

मेरे पास कुछ सरल मार्ग हैं जिन्हें मैं एक साधारण क्वेरीस्ट्रिंग पैरा के माध्यम से प्रतिबंधित करना चाहता हूं। अगर कुंजी गलत है या उपलब्ध नहीं है, तो मैं NotAuthorizedException फेंकना चाहता हूं।क्या मुझे एक IAuthorizationFilter का उपयोग करना चाहिए यदि मैं ASP.NET MVC4 के साथ एक एपीकी प्रतिबंधित संसाधन बनाना चाहता हूं?

कृपया सुझाव न दें कि मैं वेबएपी या इक्विव का उपयोग करता हूं - मैं अभी तक इस परिदृश्य में नहीं कर सकता।

इसलिए मुझे यकीन नहीं है कि मुझे IAuthorizationFilter लागू करना चाहिए या IActionFilter या यहां तक ​​कि कुछ और लागू करना चाहिए।

मेरा कोड तर्क?

  • कुंजी के लिए क्वेरीस्ट्रिंग जांचें।
  • उस कुंजी/मूल्य वाले उपयोगकर्ता के लिए मेरे RavenDb (भंडार) की जांच करें।

वे उन चेकों के किसी भी विफल रहते हैं, तो NotAuthorizedException फेंक देते हैं।

मुझे लगता है कि मैं इस फ़िल्टर के साथ अपनी क्रिया विधि को सजाने के लिए तैयार करूंगा। मुझे यह भी लगता है कि मुझे इस क्रिया विधि में भी मेरे भंडार में पास करने की आवश्यकता होगी?

कोई सुझाव कृपया?

उत्तर

25

तो मैं अगर मैं एक IAuthorizationFilter को लागू किया जाना चाहिए या एक IActionFilter को लागू करने या यहाँ तक कि कुछ और यकीन नहीं है।

public class MyAuthorizeAttribute: FilterAttribute, IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     var key = filterContext.HttpContext.Request.QueryString["param_name"]; 
     if (!IsValid(key)) 
     { 
      // Unauthorized! 
      filterContext.Result = new HttpUnauthorizedResult(); 
     } 
    } 

    private bool IsValid(string key) 
    { 
     // You know what to do here => go hit your RavenDb 
     // and perform the necessary checks 
     throw new NotImplementedException(); 
    } 
} 

और अगर आप अपने कस्टम क्रिया फिल्टर में निर्भरता इंजेक्शन का उपयोग करना चाहता आप following article पर एक नज़र है जिसमें आप कोई कस्टम फ़िल्टर प्रदाता को लागू कर सकता है ले सकता है:

आप एक IAuthorizationFilter को लागू किया जाना चाहिए (IFilterProvider)। आपके पास एक चिह्नित विशेषता हो सकती है जिसे आप नियंत्रक क्रियाओं पर उपयोग कर सकते हैं और उसके बाद यह कस्टम फ़िल्टर प्रदाता यह देख सकता है कि कार्रवाई इस मार्कर विशेषता से सजाई गई है और कस्टम प्राधिकरण फ़िल्टर लागू करें।

उदाहरण के लिए:

public class MyAuthorizeAttribute: Attribute 
{ 

} 

और अपने प्राधिकरण फिल्टर केवल IAuthorizationFilter को लागू करेगा, यह एक FilterAttribute नहीं होगा:

public class MyAuthorizationFilter: IAuthorizationFilter 
{ 
    private readonly ISomeRepository repository; 
    public class MyAuthorizationFilter(ISomeRepository repository) 
    { 
     this.repository = repository; 
    } 

    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     var key = filterContext.HttpContext.Request.QueryString["param_name"]; 
     if (!IsValid(key)) 
     { 
      // Unauthorized! 
      filterContext.Result = new HttpUnauthorizedResult(); 
     } 
    } 

    private bool IsValid(string key) 
    { 
     // You know what to do here => go hit your RavenDb 
     // and perform the necessary checks 
     throw new NotImplementedException(); 
    } 
} 

और फिर आप कस्टम फ़िल्टर प्रदाता होगा:

public class MyFilterProvider : IFilterProvider 
{ 
    public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) 
    { 
     if (actionDescriptor.GetCustomAttributes(typeof(MyAuthorizeAttribute), true).Any()) 
     { 
      var filter = DependencyResolver.Current.GetService<MyAuthorizationFilter>(); 
      yield return new Filter(filter, FilterScope.Global); 
     } 

     yield break; 
    } 
} 

जो आपके लिए पंजीकृत होगा आर Application_Start:

FilterProviders.Providers.Add(new MyFilterProvider()); 
+0

धन्यवाद ढेर डारिन! मैंने देखा कि आपने कंस्ट्रक्टर इंजेक्शन के बजाय प्रॉपर्टी इंजेक्शन (मुझे लगता है कि यह कहा जाता है) का उपयोग किया जाता है - क्या कोई कारण है कि मैं इसे 'माईअधिकृतिशनफिल्टर' कक्षा में नहीं कर सकता था .. और 'MyAuthorizationFilter' को' फ़िल्टर एट्रिब्यूट'? तब मेरे पास केवल 1 वर्ग होगा, न कि 2 बनाने के लिए। –

+0

नहीं, यह कन्स्ट्रक्टर इंजेक्शन का उपयोग कर रहा है। 'DependencyResolver' 'MyFilterProvider' में क्या कर रहा है।मुझे लगता है कि आप एक वर्ग का उपयोग नहीं कर सकते क्योंकि ढांचा निर्भरता रिसेल्वर का उपयोग करके विशेषताओं का निर्माण नहीं करता है और इस तरह, आप इसके साथ अपने कार्यों को सजाने नहीं कर सकते क्योंकि इसे कन्स्ट्रक्टर में पास की गई 'रिपोजिटरी' की आवश्यकता होती है और आप एक उपलब्ध नहीं होगा। क्या गुणों पर कन्स्ट्रक्टर इंजेक्शन करने का कोई बेहतर तरीका है क्योंकि इस कार्यान्वयन से '[MyAuthorize (ErrorMessage =" Sad पांडा ") जैसी चीजों को करना मुश्किल हो जाएगा। – ajbeaven

+0

@ajbeaven आप अपनी विशेषता को पैरामीटर के साथ बना सकते हैं, और फिर उन्हें आंतरिक गुणों के रूप में सेट कर सकते हैं और प्राधिकरण के भीतर से विशेषता प्राप्त कर सकते हैं फ़िल्टर को इसके गुण/फ़ील्ड तक पहुंच प्राप्त करने के लिए। 'FilterContext.ActionDescriptor.GetCustomAttributes (टाइपऑफ (YourClass), सत्य का उपयोग करें) .स्ट (); 'विशेषता प्राप्त करने के लिए। यदि आपके पास उनके लिए एक समर्पित परियोजना है तो आंतरिक दायरा उपयोगी है; अन्य, बस गेटर्स बनाओ। –

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

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