6

मुझे क्या करना है इसके बारे में एक सुझाव की आवश्यकता है। मैं वर्तमान में सभी खाता संबंधित नौकरी करने के लिए वेब सुरक्षा प्रक्रिया का उपयोग कर रहा हूं। हालांकि यह ई-मेल विशिष्टता सत्यापन का समर्थन नहीं करता तो मैं कुछ ही विकल्प हैं:एएसपी एमवीसी 4 सदस्यता और वेब सुरक्षा

  1. लिखें (उपवर्ग) एक नई SimpleMembershipProvider ईमेल पते को सत्यापित करने के लिए मौजूदा createuserAndAccount विधि को अधिलेखित। लेकिन मुझे लॉगिन-लॉगआउट सुविधाओं को भी लागू करना होगा (जैसे वेबसेक्रिटी करता है) और कुछ अन्य।

  2. डेटाबेस पर विशिष्टता बाधाओं को जोड़ें और उन्हें मेरे कोड पर पकड़ें। हालांकि यह मुझे डेटाबेस निर्भर होने का कारण बनता है।

  3. यह थोड़ा सस्ता हो सकता है, लेकिन मैं एक नई कक्षा पर वेब सुरक्षा स्रोत कोड (इसके खुले होने के बाद) कॉपी/पेस्ट कर सकता हूं, और createUserAndAccount विधि को संशोधित कर सकता हूं।

कोई अन्य विकल्प? मैं इस समय विकल्प 3 का लक्ष्य रख रहा हूं, सबसे तेज़ तरीका होगा। एक तरफ ध्यान दें, भविष्य में मुझे भूमिकाओं की भी आवश्यकता होगी और मुझे यकीन नहीं है कि वेब सुरक्षा उनके लिए समर्थन प्रदान करती है या नहीं।

+0

अगर यह एक नया डेटाबेस है, एक और विकल्प एक उपयोगकर्ता नाम के रूप में ईमेल का उपयोग करना होगा। उपयोगकर्ता नाम डिफ़ॉल्ट रूप से अद्वितीय है। – Igarioshka

उत्तर

5

में डिफ़ॉल्ट प्रदाता के रूप में अपनी सदस्यता प्रदाता रजिस्टर तो यह मेरे थे अपने ईमेल परिवर्तन जोड़ सकते हैं, मैं शायद इसके बारे में निम्न तरीके से जाऊंगा:

सबसे पहले, मान लें कि आप एंटिटी फ्रेमवर्क या कुछ दा के साथ सरलमेम्बरशिप का उपयोग कर रहे हैं टैबस कनेक्शन (एडीओ, LINQ से SQL, आदि) आपके पास दो घटक होंगे: WebSecurity.* विधि कॉल, और प्रोफ़ाइल परिवर्तन करने के लिए डेटाबेस कनेक्शन। व्यक्तिगत रूप से, मैं यह सुनिश्चित करने के लिए डेटाबेस में CONSTRAINT डेटाबेस जोड़ दूंगा, लेकिन आप इस तर्क को संभालने वाली सदस्यता सेवा भी कार्यान्वित कर सकते हैं।

सबसे पहले, एक अंतरफलक है कि आपके नियंत्रक में संदर्भित किया जा सकता (जैसे कुछ के बाद) के लिए समूह इन:

public interface IMembershipService 
{ 
    Int32 CurrentUserId { get; } 
    String CurrentUserName { get; } 
    Boolean IsAuthenticated { get; } 

    Boolean CreateUserAndAccount(String username, String password, String emailaddress = null); 
    Boolean CreateUserAndAccount(String username, string password, out String confirmationToken, String emailaddress = null); 
    Boolean Login(String username, String password, Boolean persistCookie = false); 
    void Logout(); 
} 

तो फिर आप अपने डेटाबेस कनेक्शन SimpleMembership का एक संकर और के रूप में सेवा को लागू कर सकते हैं। इसे सामान्य रखने के लिए, मैं IRepository<T> पैटर्न का उपयोग करता हूं, लेकिन यह प्रत्यक्ष DbContext, ObjectContext आदि हो सकता है। मैं इसे संक्षिप्त भी रख रहा हूं, इसलिए लापता चेकसम और छोटे कार्यान्वयन को क्षमा करें।

public class MembershipService : IMembershipService 
{ 
    protected readonly SimpleMembershipProvider membershiProvider; 
    protected readonly SimpleRoleProvider roleProvider; 
    protected readonly IRepository<UserProfile> profileRepository; 

    public MembershipService(IRepository<UserProfile> profileRepository) 
    { 
     this.membershipProvider = Membership.Provider as SimpleMembershipProvider; 
     this.roleProvider = Role.Provider as SimpleRoleProvider; 
     this.profileRepository = userRepository; 
    } 

    #region IMembershipService Implementation 

    public Int32 CurrentUserId 
    { 
     get { return WebSecurity.CurrentUserId; } 
    } 
    public String CurrentUserName 
    { 
     get { return WebSecurity.CurrentUserName; } 
    } 
    public Boolean IsAuthenticated 
    { 
     get { return WebSecurity.IsAuthenticated; } 
    } 

    public Boolean CreateUserAndAccount(String username, String password, String emailaddress = null) 
    { 
     // validate the email address is unique 
     if (!this.profileRepository.Any(x => x.EmailAddress == emailaddress)) 
     { 
      WebSecurity.CreateUserAndAccount(username, password, new 
      { 
       EmailAddress = emailaddress 
      }, createConfirmationToken); 
      return true; 
     } 
     else 
     { 
      // handle the error how you see fit 
      // (maybe even exception?) 
      return false; 
     } 
    } 
    public Boolean CreateUserAndAccount(String username, String password, out String confirmationToken, String emailaddress = null, out) 
    { 
     // validate the email address is unique 
     if (this.profileRepository.First(x => x.EmailAddress == emailaddress) == null) 
     { 
      confirmationToken = WebSecurity.CreateUserAndAccount(username, password, new 
      { 
       EmailAddress = emailaddress 
      }, createConfirmationToken); 
      return true; 
     } 
     else 
     { 
      // handle the error how you see fit 
      // (maybe even exception?) 
      confirmationToken = String.Empty; 
      return false; 
     } 
    } 
    public Boolean Login(String username, String password, Boolean persistCookie = false) 
    { 
     return WebSecurity.Login(username, password, persistCookie); 
    } 
    public void Logout() 
    { 
     WebSecurity.Logout(); 
    } 

    #endregion 
} 

अब आप इस इंटरफ़ेस को अपने नियंत्रक में संदर्भित कर सकते हैं और तर्क एक ही स्थान पर कर सकते हैं। यदि आप एक डि कंटेनर का उपयोग कर रहे हैं, जाहिर है यह रजिस्टर, लेकिन यहाँ एक उदाहरण दिया गया है:

public class AccountController: Controller 
{ 
    private readonly IMembershipService membershipService; 

    public AccountController(IMembershipService membershipService) 
    { 
     this.membershipService = membershipService; 
    } 

    /* ... */ 

    [HttpPost, ValidateAntiForgeryToken] 
    public ActionResult Register(LoginViewModel model, String returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (this.membershipService.CreateUserandAccount(model.Username, model.Password, model.EmailAddress)) 
      { 
       this.membershipService.Login(model.Username, model.Password); 
       if (!String.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl)) 
       { 
        return Redirect(returnUrl); 
       } 
       return RedirectToRoute("Default"); 
      } 
      else 
      { 
       ModelState.AddModelError("", "Unable to register."); 
      } 
     } 
     return View(model); 
    } 

    /* ... */ 
} 

आप EntityFramework का उपयोग कर रहे हैं, तो आप भी IValidatableObject उपयोग कर सकते हैं। नकल का विरोध करने के लिए, यहाँ एक और एसओ प्रश्न/उत्तर है कि एक अद्वितीय प्रविष्टि के लिए जाँच करता है:

Entity Framework IValidatableObject

+0

इसे प्यार किया! यह वास्तव में एक अच्छा समाधान है। – user1777914

+0

भयानक, खुश मैं मदद कर सकता था। –

+0

नाइस रैपर। धन्यवाद –

0

उपयोग विकल्प एक 1. अपने कस्टम सदस्यता ExtendedMemberShipprovider से यूनिट testablity के लिए WebSecurity के लिए एक आवरण के वारिस AccountMembershipProvider : ExtendedMembershipProvider

  1. उपयोगकर्ता उदाहरण

    public interface IWebSecurity 
           { 
    
            bool Login(string userName, string password, bool rememberMe = false); 
            bool ChangePassword(string userName, string currentnPassword, string newPassword); 
            void LogOut(); 
           } 
    

    सार्वजनिक वर्ग WebSecurityWrapper कार्य करें: IWebSecurity

    {

    public bool Login(string userName, string password, bool rememberMe) 
        { 
         return WebSecurity.Login(userName, password, rememberMe); 
        } 
    
    
        public bool ChangePassword(string userName, string currentPassword, string newPassword) 
        { 
         return WebSecurity.ChangePassword(userName, currentPassword, newPassword); 
        } 
    
        public void LogOut() 
        { 
         WebSecurity.Logout(); 
        } 
    } 
    

यहाँ आप आप चाहते हैं जो कुछ भी विधि

  1. अपने web.config
+0

मैं एक इंटरफेस बनाने के साथ सहमत हूं, लेकिन आप आसानी से कार्यान्वयन के भीतर अद्वितीय ईमेल बाधा लागू कर सकते हैं। लेकिन मैं भी एक दृढ़ आस्तिक हूं कि इस प्रकार की बाधा डेटाबेस स्तर पर की जानी चाहिए और वेब प्रोजेक्ट पर बुलबुला होना चाहिए। –

+0

ठीक है, यह एक सत्यापन मुद्दा है। मैं सत्यापित कर दूंगा और जैसा कि आपने कहा है कि डीबी पक्ष भी –

+0

कार्यान्वित करना विस्तारित मेमर्सशिप प्रदाता का कार्यान्वयन केवल एक अतिरिक्त कार्यक्षमता के लिए बहुत अधिक काम करेगा क्योंकि मुझे सरल तरीकों को लागू करने के दौरान सभी विधियों को लागू करना होगा, मैं केवल पंजीकरण विधि को ओवरराइड कर सकता हूं, यह आसान नहीं है? मैं इस नई कक्षा में लॉगिन/लॉगआउट विधियों को भी जोड़ सकता हूं। पूरे विस्तार को लागू करने की आवश्यकता क्यों है? – user1777914

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