2011-07-11 14 views
5

मैं स्कॉट मिलेट द्वारा व्यावसायिक एएसपी.नेट डिजाइन पैटर्न में केस स्टडी का पालन कर रहा हूं। मामले के अध्ययन में, इंफ्रास्ट्रक्चर परियोजना में प्रमाणीकरण को संभाला जाता है। इसमें एस्पॉर्म्स प्रमाणीकरण जैसे कार्यान्वयन शामिल हैं: IForms प्रमाणीकरण, AspMembership प्रमाणीकरण: ILocalAuthenticationService।डीडीडी प्रमाणीकरण सेवा

यह ठीक काम करता है, क्योंकि वह अंतर्निहित सदस्यता प्रदाता का उपयोग कर रहा है, हालांकि, मैं नहीं हूं, इसलिए मुझे अपने भंडारों तक पहुंच की आवश्यकता होगी। मेरे परिदृश्य में, क्या यह मेरी परियोजनाओं में मेरी ILocalAuthenticationService और AspMembership प्रमाणीकरण कार्यान्वयन को बेहतर नहीं होगा?

मैं इस कहीं और पूछा, और किसी ने जवाब दिया:

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

ग्रेट। यह समझ में आता है। लेकिन मुझे नहीं पता कि यहां से कहाँ जाना है। मामले का अध्ययन से कोड:

public class AspMembershipAuthentication : ILocalAuthenticationService 
{ 
    public User Login(string email, string password) 
    { 
     User user = new User(); 
     user.IsAuthenticated= false; 

     if (Membership.ValidateUser(email, password)) 
     { 
      MembershipUser validatedUser = Membership.GetUser(email); 
      user.AuthenticationToken = validatedUser.ProviderUserKey.ToString(); 
      user.Email = email; 
      user.IsAuthenticated = true; 
     } 

     return user; 
    } 

    public User RegisterUser(string email, string password) 
    {    
     MembershipCreateStatus status; 
     User user = new User(); 
     user.IsAuthenticated = false; 

     Membership.CreateUser(email, password, email, 
           Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 
           true, out status); 

     if (status == MembershipCreateStatus.Success) 
     { 
      MembershipUser newlyCreatedUser = Membership.GetUser(email); 
      user.AuthenticationToken = newlyCreatedUser.ProviderUserKey.ToString(); 
      user.Email = email; 
      user.IsAuthenticated = true; 
     } 
     else 
     { 
      switch (status) 
      { 
       case MembershipCreateStatus.DuplicateEmail: 
        throw new InvalidOperationException(
          "There is already a user with this email address."); 
       case MembershipCreateStatus.DuplicateUserName: 
        throw new InvalidOperationException(
          "There is already a user with this email address."); 
       case MembershipCreateStatus.InvalidEmail: 
        throw new InvalidOperationException(
          "Your email address is invalid"); 
       default: 
        throw new InvalidOperationException(
        "There was a problem creating your account. Please try again."); 
      } 
     } 

     return user; 
    }  
} 

मैं सदस्यता प्रदाता का उपयोग नहीं कर रहा हूँ, तो मैं कैसे डेटाबेस से कनेक्ट करते हैं अन्य संभावित चेकों के बीच में, यदि उपयोगकर्ता नाम और पासवर्ड मैचों की जांच के लिए?

+1

प्रमाणीकरण एक अनुप्रयोग स्तर की चिंता है। यह आपके डोमेन का हिस्सा नहीं है। – jfar

उत्तर

3

अपनी आधारभूत संरचना परत में एक ऐसी कक्षा बनाएं जो ILocalAuthenticationService लागू करती है और आपको आवश्यक कॉल करता है।

या, यदि ILocalAuthenticationService भी ASP.NET-y है (इसके उपयोगकर्ता रिटर्न प्रकार के साथ) तो आपको अपना खुद का ILocalAuthenticationService-variant रोल करना होगा और उस पर लागू करना होगा।

फिर जब आपको इसकी आवश्यकता हो तो ILocalAuthenticationService को हल करने के लिए अपने आईओसी कंटेनर का उपयोग करें।

+0

उत्तर के लिए धन्यवाद। मेरी आधारभूत संरचना परत में पहले से ही ILocalAuthenticationService है और, उपरोक्त के समान, कार्यान्वयन AspMembership प्रमाणीकरण। मैंने ऊपर पोस्ट किया गया कार्यान्वयन डिफ़ॉल्ट सदस्यता प्रदाता का उपयोग करता है, जबकि मैं इसका उपयोग करने की योजना नहीं बना रहा हूं। तो, इंफ्रास्ट्रक्चर परत के भीतर से, मैं उपरोक्त कार्यान्वयन जैसे चेक चेक करने के लिए डेटा प्रदाता के साथ डेटा का उपयोग कैसे करूं? – getoutofmylaboratory

+0

मुझे लगता है - तो आपकी आधारभूत संरचना परत डेटा परत नहीं देख सकती है? क्या होगा यदि आपकी प्रमाणीकरण सेवा कहीं भी रहती है जो डीबी को देख सकता है - एक आईओसी परिप्रेक्ष्य से आपके क्लाइंट वास्तव में परवाह नहीं करते हैं कि यह कहां से आता है। यदि आधारभूत संरचना परत डीबी नहीं देख पाती है और आपका प्राधिकरण डीबी-आधारित है, तो यह बुनियादी ढांचे परत में नहीं रह सकता है, जैसा कि आप पहले ही पता लगा चुके हैं :) – n8wrl

+0

बिल्कुल! मूल रूप से, मैं सेवा परत में ऐसा करने की योजना बना रहा था। हालांकि, मैंने सवाल किया क्योंकि "ऐसा नहीं है कि मामले के अध्ययन में यह कैसे किया जाता है"। इसलिए मैंने पूछा, लेकिन चिंताओं को अलग करने के कारण इंफ्रास्ट्रक्चर परत में इसे रखने की सिफारिश की गई थी (उद्धरण उद्धरण से)। मैं इसे सेवा परत में डालने की सोच रहा था ताकि मैं डेटाबेस के साथ संवाद करने में सक्षम होने के लिए अपने भंडारों का उपयोग कर सकूं। आप इसके आधार पर क्या सुझाव देंगे? – getoutofmylaboratory

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