2015-07-27 9 views
6

में मैं समकक्ष वेब एपीआई 2 प्रोजेक्ट को एमवीसी 6 में ले जा रहा हूं, क्योंकि माइक्रोसॉफ्ट एएसपी.नेट 5 में दो एपीआई विलय कर रहा है। मेरे वेबएपीआई प्रोजेक्ट में मेरे पास एक कस्टम एट्रिब्यूट फ़िल्टर क्लास था जो प्रमाणित, अधिकृत और सार्वजनिक कुंजी, निजी कुंजी और एचएमएसी प्रमाणीकरण (मूल रूप से, doing this) के संयोजन का उपयोग करके लेनदेन की प्रतियों को रोकें, मेरी परियोजना में फिट होने के कुछ बदलावों के साथ)।IV प्रमाणीकरण फ़िल्टर एमवीसी 6

अब एमवीसी 6 में, जहां तक ​​मैं समझता हूं कि मुझे माइक्रोसॉफ्ट.Web.Http नेमस्पेस में कुछ भी उपयोग करना बंद करना होगा और इसके बजाय Microsoft.AspNet.Mvc का उपयोग करना होगा। तो मैंने ऐसा किया है, लेकिन माइक्रोसॉफ्ट.एस्पनेट.एमवीसी फ़िल्टर में वेब एपीआई 2 के IAuthenticationFilter के बराबर प्रतीत नहीं होता है।

यह मेरे लिए एक समस्या है क्योंकि मेरे ग्राहक प्रमाणीकरणफिल्टर ने सभी तर्कों के साथ सभी IAuthenticationFilter को लागू किया है। सबसे महत्वपूर्ण बात यह है कि यह संदर्भ का उपयोग अस्थायी रूप से खाते की सार्वजनिक कुंजी को संग्रहीत करने के लिए कर रहा था, इसलिए मेरा नियंत्रक बदले में खाते को लोड करने के लिए इसका उपयोग कर सकता था।

तो मेरा सवाल यह है कि अनुरोधों को रोकने और उचित स्थिति कोड वापस करने के लिए प्रमाणीकरण फ़िल्टर-जैसी कक्षा का उपयोग करके एमवीसी 6 में अनुरोध फ़िल्टर करने का उचित तरीका क्या है? मुझे कोई भी लेख नहीं मिल रहा है जो विशेष रूप से इन विवरणों में जाता है (वे सभी एमवीसी 5 को कवर करते हैं)।

उत्तर

4

मुझे पता है कि यह एक पुराना सवाल है, लेकिन उम्मीद है कि किसी को (शायद खुद को भी) जवाब में मूल्य मिल सकता है।

एमवीसी 6 वास्तव में एक विकल्प है। आप एक

public abstract class AuthorizationFilterAttribute : 
    Attribute, IAsyncAuthorizationFilter, IAuthorizationFilter, IOrderedFilter 

जो मूल रूप से आपको बताता है, जिसे आप अपने कस्टम वर्ग बना सकते हैं, इस (इन इंटरफेस के सभी के नाम स्थान से निकाले जाते हैं, btw, Microsoft.AspNet.Mvc.Filters है और है कि यह होना चाहिए। आप को सजाने कर सकते हैं या तो इसके साथ कार्रवाई, या आप Startup.cs में ऐसा कर सकते हैं, सभी कार्यों को लागू करने के लिए:

public void ConfigureServices(IServiceCollection services) 
    { 
     // Add MVC services to the services container. 
     services.AddMvc(options => 
     { 
      // add an instance of the filter, like we used to do it 
      options.Filters.Add(new MySpecialFilter()); 
     }); 

     services.AddTransient<LogFilter>(); 
    } 

आप फिल्टर में थोड़ा अधिक तर्क उपयोग करना चाहते हैं (उदाहरण के लिए मेरे ऊपर LogFilter) जो instantiated है DI के माध्यम से, आपको Service Filters or Type Filters का उपयोग करने की आवश्यकता है।

अब आप [ServiceFilter(typeof(LogFilter))] के साथ क्रियाओं को सजाने या स्टार्टअप.cs फ़ाइल में o.Filters.Add(new ServiceFilterAttribute(typeof(LogFilter))); का उपयोग कर सकते हैं। लेकिन ध्यान रखें, ऐसा करने के लिए आपको को डी कंटेनर के साथ प्रकार पंजीकृत करें, जैसा कि मैंने .AddTransient<>() कॉल के साथ किया था।

1

IAuthenticationFilter अधिक नहीं है और IAuthorizationFilter बस MVC 6 में यह प्रतिस्थापित नहीं करता

कारण: प्रमाणीकरण प्राधिकरण के बराबर नहीं है।

इसलिए आईएमओ प्रमाणीकरण फ़िल्टर उपलब्ध रहना चाहिए!

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