2015-09-13 22 views
7

के लिए नोएसQL पहचान प्रदाता को कैसे कार्यान्वित करें कोई दस्तावेज नहीं है।एएसपी.नेट 5 एमवीसी 6

मुझे पता है कि मुझे अपने स्वयं के IUser, मेरे स्वयं के IUserstore को लागू करना है और किसी भी तरह उन्हें startup.cs में पंजीकृत करना है। मैंने EntityFramework के सभी संदर्भ हटा दिए क्योंकि मैं नोएसQL बैकएंड का उपयोग करना चाहता हूं।

"सम्मेलन" दर्शन तब तक बहुत अच्छा है जब तक यह दस्तावेज और सार्वजनिक होता है।

कोई संकेत?

+0

इस प्रश्न के समान ही लगता है http://stackoverflow.com/questions/31795792/example-of-using-asp-net-identity-3-0-without-entity-framework/31813863 –

+0

धन्यवाद। मैं ह्युरिस्टिक रूप से सीख रहा हूँ। विरासत पहचान पैकेज का उपयोग न करने के लिए सावधान रहें। यह मेरा मामला था। अब मैं अपने कस्टम उपयोगकर्ता स्टोर और रोलस्टोर पंजीकरण के बाद अपवाद को हल कर रहा हूं () .ddUserStore () .ddRoleStore () .ddDefaultTokenProviders(); – user2715109

+1

यह एक अच्छा और काम कर रहा है, उदाहरण (एमवीसी 6) और एएसपी.NET 5 पहचान (> = v3) फ्रेमवर्क के साथ कार्यान्वयन का मुक्ति MongoDB.Driver (> = v2.1.0) https: // github के लिए इकाई फ्रेमवर्क के बिना। कॉम/saan800/SaanSoft.AspNet.Identity3.MongoDB –

उत्तर

8

मैंने अभी पहचान 2.0 का एक कस्टम कार्यान्वयन किया है, और जैसा कि आपने कहा था, मुझे कोई उपयोगी दस्तावेज नहीं मिला। लेकिन सौभाग्य से मैं अपना लक्ष्य हासिल करने में कामयाब रहा।

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

मैं चरणों आप एक कस्टम डेटा का उपयोग के साथ पहचान ढांचे का उपयोग करने के लिए पालन करना होगा समझाएंगे:,

सबसे पहले आप, अपने डोमेन वर्ग घोषित करने के लिए IUser लागू करने और, यदि आप चाहते है इसे करने के लिए कस्टम गुण जोड़ने :

//This class is implementing IUser with Guid as type because 
//I needed to use Guid as default Id. 
public class CustomUser : IUser<Guid> 
{ 
     public string CustomProperty { get; set; } 
} 

फिर, अपने व्यापार तर्क परत में, आप एक वर्ग है कि उपयोगकर्ता प्राधिकरण, प्रवेश, पासवर्ड वसूली, दूसरों के बीच से संबंधित सभी कार्य संभालती होना चाहिए। इस वर्ग को UserManager से प्राप्त होना चाहिए। परिणाम कुछ इस प्रकार होगा:

// Business layer class must inherit from UserManager with 
// CustomUser and Guid as types 
public AuthorizationManager : UserManager<CustomUser, Guid>, IAuthorizationManager 
{ 
     private readonly ICustomUserMongoRepository repository; 
     private readonly ICustomEmailService emailService; 
     private readonly ICustomTokenProvider tokenProvider; 

     // Parameters being injected by Unity. 
     // container.RegisterType<ICustomUserMongoRepository, CustomUserMongoRepository>(); 
     // .. 
     // .. 
     public AuthorizationManager(
        ICustomUserMongoRepository repository, 
        ICustomEmailService emailService, 
        ICustomTokenProvider tokenProvider 
        ) 
           // calling base constructor passing 
           // a repository which implements 
           // IUserStore, among others. 
           : base(repository) 
     { 
      this.repository = repository; 

      // this.EmailService is a property of UserManager and 
      // it has to be set to send emails by your class 
      this.EmailService = emailService; 

      // this.UserTokenProvider is a property of UserManager and 
      // it has to be set to generate tokens for user password 
      // recovery and confirmation tokens 
      this.UserTokenProvider = tokenProvider; 
     } 
} 

जब UserManager से इनहेरिट, यह पहचान द्वारा इस्तेमाल किया तरीकों की एक श्रृंखला प्रदान करेगा और यह अपने वर्ग आधार निर्माता भंडार गुजर नहीं, बल्कि किसी भी भंडार कॉल करने के लिए बाध्य करेगा, इंटरफेस को लागू करने के लिए भंडार के लिए अनिवार्य है: IUserStore, IPasswordStore, आपकी आवश्यकताओं के आधार पर।

यहां ठंडा सामान होता है। आपके डेटा एक्सेस लेयर में आपके पास नोएसक्यूएल डेटाबेस से कनेक्ट रिपोजिटरी पैटर्न का अपना कस्टम कार्यान्वयन होना चाहिए (आइए मान लें कि यह मोंगो है)। तो, अपने ICustomUserMongoRepository कुछ इस तरह दिखना चाहिए:

public interface ICustomUserMongoRepository : IUserPasswordStore<CustomUser, Guid>, IUserEmailStore<CustomUser, Guid>, IUserRoleStore<CustomUser, Guid> 
{ 
} 

और अपने मोंगो भंडार इस

public CustomUserMongoRepository : MongoRepository<CustomUser>, ICustomUserMongoRepository 
{ 
     // Here you must have your custom implementation (using Mongo) of 
     // ICustomUserRepository which is requesting your class to 
     // implement IUserPasswordStore methods as well 

     public Task CreateAsync(CustomUser user) 
     { 
      //Custom Mongo implementation 
     } 

     public Task DeleteAsync(CustomUser user) 
     { 
      //Custom Mongo implementation 
     } 

     public Task GetEmailAsync(CustomUser user) 
     { 
      //Custom Mongo implementation 
     } 

     public Task GetEmailConfirmedAsync(CustomUser user) 
     { 
      //Custom Mongo implementation 
     } 

     // ... 
} 

की तरह कुछ फिर अंत में अपने नियंत्रक कुछ इस तरह दिखेगा होना चाहिए:

public class AuthController : Controller 
{ 

    private readonly IAuthorizationManager manager;   

     // Manager being injected by Unity. 
     // container.RegisterType<IAuthorizationManager, AuthorizationManager>(); 
    public AuthController(IAuthorizationManager manager) 
    { 
      this.manager = manager; 
    } 

    // Receives a LogInViewModel with all data needed to allow users to log in 
    [HttpPost] 
    public async Task<ActionResult> LogIn(LogInViewModel viewModel) 
    { 
     // FindAsync it's a method inherited from UserManager, that's 
     // using the Mongo repository passed to the base class 
     // in the AuthorizationManager constructor 
     var user = this.manager.FindAsync(viewModel.Email, viewModel.Password); 

     if(user != null){ // Log in user and create user session } 
     else { // Wrong username or password } 

    } 
} 

जरूरी!

इंटरफ़ेस IAuthorizationManager इसका उपयोग सोलिड सिद्धांतों के आधार पर गुणवत्ता सॉफ़्टवेयर देने के लिए किया जाता है। और यदि आप इसमें घनिष्ठ विचार रखते हैं और इसमें गहरा विचार डालते हैं, तो आप देखेंगे कि इस इंटरफ़ेस में ऑथकंट्रोलर को सभी प्रबंधित विधियों को उपयोगकर्ता प्रबंधन श्रेणी

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

+1

धन्यवाद! मैंने पहले से पहचान 3 के लिए अपनी पहचान कक्षाओं को लागू किया है। यह पहचान 2 के मुकाबले कहीं अधिक आसान है। आपको केवल उपयोगकर्तास्टोर और रोलस्टोर को पहचान 3 में ओवरराइड करने की आवश्यकता है! – user2715109

+0

बेहतर अभी तक। अस्सलाम वालेकुम – wilsotobianco

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