तो मैं अगर मैं एक 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());
स्रोत
2013-05-23 08:25:35
धन्यवाद ढेर डारिन! मैंने देखा कि आपने कंस्ट्रक्टर इंजेक्शन के बजाय प्रॉपर्टी इंजेक्शन (मुझे लगता है कि यह कहा जाता है) का उपयोग किया जाता है - क्या कोई कारण है कि मैं इसे 'माईअधिकृतिशनफिल्टर' कक्षा में नहीं कर सकता था .. और 'MyAuthorizationFilter' को' फ़िल्टर एट्रिब्यूट'? तब मेरे पास केवल 1 वर्ग होगा, न कि 2 बनाने के लिए। –
नहीं, यह कन्स्ट्रक्टर इंजेक्शन का उपयोग कर रहा है। 'DependencyResolver' 'MyFilterProvider' में क्या कर रहा है।मुझे लगता है कि आप एक वर्ग का उपयोग नहीं कर सकते क्योंकि ढांचा निर्भरता रिसेल्वर का उपयोग करके विशेषताओं का निर्माण नहीं करता है और इस तरह, आप इसके साथ अपने कार्यों को सजाने नहीं कर सकते क्योंकि इसे कन्स्ट्रक्टर में पास की गई 'रिपोजिटरी' की आवश्यकता होती है और आप एक उपलब्ध नहीं होगा। क्या गुणों पर कन्स्ट्रक्टर इंजेक्शन करने का कोई बेहतर तरीका है क्योंकि इस कार्यान्वयन से '[MyAuthorize (ErrorMessage =" Sad पांडा ") जैसी चीजों को करना मुश्किल हो जाएगा। – ajbeaven
@ajbeaven आप अपनी विशेषता को पैरामीटर के साथ बना सकते हैं, और फिर उन्हें आंतरिक गुणों के रूप में सेट कर सकते हैं और प्राधिकरण के भीतर से विशेषता प्राप्त कर सकते हैं फ़िल्टर को इसके गुण/फ़ील्ड तक पहुंच प्राप्त करने के लिए। 'FilterContext.ActionDescriptor.GetCustomAttributes (टाइपऑफ (YourClass), सत्य का उपयोग करें) .स्ट(); 'विशेषता प्राप्त करने के लिए। यदि आपके पास उनके लिए एक समर्पित परियोजना है तो आंतरिक दायरा उपयोगी है; अन्य, बस गेटर्स बनाओ। –