18

के साथ आईओसी सदस्यता प्रदाता को एकीकृत करने के लिए कैसे करें मेरे पास एक कस्टम सदस्यता/भूमिका प्रदाता है जो मैं अपने एमवीसी नियंत्रकों में उपयोग करता हूं कि मैं एएसपी.नेट एमवीसी के लिए भी पहुंच प्राप्त करना चाहता हूं, इसलिए मैं प्राधिकरण फ़िल्टर आदि का उपयोग कर सकता हूं। के बाद से इतने सारे लोगों कस्टम प्रदाताओं को लागू किया है मुझे लगता है कि कई लोगों को यह किया है लेकिन मैं इसे समझ नहीं किया है बाहर या पाया पोस्टिंग कि इस समस्या को विशेष रूप से संबोधित करते हैं। This post मेरे प्रश्न का एक फ्लिप पक्ष है। मेरे मामले में मेरे पास मेरे कस्टम प्रदाता मेरे नियंत्रकों के साथ अच्छी तरह से काम कर रहा है, और मैं एमवीसी को भी इसका उपयोग करना चाहता हूं।एएसपी.NET एमवीसी

मेरे प्रदाता एक आईओसी/निर्भरता इंजेक्शन डिजाइन के साथ किया जाता है। प्रदाता बेसलाइन सदस्यता/भूमिका एपीआई से परे अतिरिक्त कार्यक्षमता का खुलासा करता है। मेरे नियंत्रकों में, मैं उदाहरण बनाने के लिए कैसल विंडसर का उपयोग करता हूं। कोड दिखता समान करने के लिए:

public class HomeController : Controller { 
    IMembershipService _membershipService; 
    public HomeController(IMembershipService membershipService) { 
     _membershipService= membershipService; 
    } 
} 

<castle> 
<components> 
    <component id="MembershipService" 
      service="IMembershipService, MyApp" 
      type="MembershipService, MyApp" lifestyle="PerWebRequest"> 
    <parameters> 
     <connectionString>#{defaultConnectionString}</connectionString> 
    </parameters> 
    </component> 
</components> 
</castle> 

public class WindsorControllerFactory : DefaultControllerFactory { 
    private WindsorContainer _container; 
    public WindsorControllerFactory() { 
     _container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle"))); 

     List<Type> controllerTypes = new List<Type>(); 
     foreach (Type t in Assembly.GetExecutingAssembly().GetTypes()) { 
      if (typeof(IController).IsAssignableFrom(t)) 
       controllerTypes.Add(t); 
     } 

     foreach (Type t in controllerTypes) { 
      // LifestyleType.Transient = new controller instance for each request 
      _container.AddComponentLifeStyle(t.FullName, t, LifestyleType.Transient); 
     } 
    } 

    protected override IController GetControllerInstance(Type controllerType) { 
     return (IController)_container.Resolve(controllerType); 
    } 

यह सब मेरी सी # कोड में अच्छा काम करता है, लेकिन मैं इसके साथ उपयोग करने के लिए फिल्टर [अधिकृत करें] MVC में मेरी प्रदाता तार करना चाहते हैं:

[Authorize (Users="user1, user2", Roles="role8")] 
public ViewResult MyResult(int x) { 
    // implement 
} 

मैं जानता हूँ कि एक कस्टम सदस्यता या भूमिकाओं प्रदाता के बारे में बताने के लिए ASP.NET हमेशा की तरह के रूप में नीचे web.config फ़ाइल में है लेकिन अगर मैं ऐसा करते हैं ASP.NET बस डिफ़ॉल्ट निर्माता है, जो काम नहीं करेगा कॉल करने के लिए कोशिश करेंगे। किसी भी मदद की सराहना की।

<membership> 
<providers> 
    <clear/> 
    <add name="MyMembershipProvider" type="MyMembershipProvider"> 
</providers> 
</membership> 

उत्तर

24

काम करने के लिए इसे पाने के लिए सबसे आसान तरीका web.config में <membership> के ASP.NET के मानक प्रणाली का उपयोग करने के लिए है। तुम सिर्फ यह डिफ़ॉल्ट निर्माता का उपयोग करते हैं, लेकिन आप प्रारंभ ओवरराइड() और वहाँ निर्भरता खींच। संदर्भ के रूप में this का उपयोग करें।

व्यक्तिगत रूप से, इस तरह की चीजों के कारण, मैं प्रदाता मॉडल से पूरी तरह से बचना पसंद करता हूं इसलिए मैं described in the MonoRail docs के समान दृष्टिकोण का उपयोग करता हूं। आईएमएचओ यह कम फूला हुआ और अधिक लचीला है। अंत में, यह HttpContext.User को उचित IPrincipal कार्यान्वयन के साथ सेट करने के बारे में है जो AuthorizeAttribute का उपयोग करता है।

मैंने हाल ही में blogged about a solution to do proper IoC with MembershipProviders देखा है।

+1

इस के लिए धन्यवाद। जबकि आपकी पहली विधि ठीक काम करती है, जैसा कि आपने कहा है कि कस्टम आईप्रिनिपियर/IIdentity कक्षाएं बनाना अधिक लचीलापन प्रदान करता है। उदाहरण के लिए, फॉर्म प्रमाणीकरण प्रदान करने से कुछ अलग प्रकार के उपयोगकर्ता/भूमिका प्राधिकरण बनाने के लिए यह एक छोटा रास्ता है। – keithm

+2

ऐसा लगता है कि वेबडॉटनेट प्रोजेक्ट वर्तमान में अपने भंडार को मर्क्यूरियल में ले जा रहा है, लिंक टूटा हुआ है :-( –

+0

वेबडॉटनेट प्रोजेक्ट अप :-) –

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