ASP.NET IdentityUser को मेरी अन्य संस्थाओं से अलग करना


11

मेरे पास एक ProjectName.Coreपुस्तकालय है जिसमें मेरे सभी व्यावसायिक तर्क और मेरी संस्थाएं और उनके व्यवहार हैं। वर्तमान में एंटिटी फ्रेमवर्क या किसी अन्य डीएएल से कोई संबंध नहीं है क्योंकि मैं उन चीजों को अलग रखना पसंद करता हूं। एंटिटी फ्रेमवर्क कॉन्फ़िगरेशन (धाराप्रवाह एपीआई का उपयोग करके) एक ProjectName.Infrastructureपरियोजना में रहता है ताकि ईएफ में मेरी संस्थाओं को आगे बढ़ाने का ध्यान रखा जाए। मूल रूप से मैं एक प्याज जैसी वास्तुकला की दिशा में जा रहा हूं।

हालाँकि, जब ASP.NET आइडेंटिटी फ्रेमवर्क को मिक्स में जोड़ते हैं, तो मुझे अपनी ApplicationUserइकाई को IdentityUserक्लास से इनहेरिट करना पड़ता है, लेकिन मेरी ApplicationUserक्लास का संबंध अन्य संस्थाओं से है। विरासत में IdentityUserमैं अपनी संस्थाओं के प्रोजेक्ट में एंटिटी फ्रेमवर्क के संदर्भ का परिचय दे रहा हूं, एक जगह जहां मैं ऐसा नहीं करना चाहता हूं। ApplicationUserएंटिटीज प्रोजेक्ट से क्लास को बाहर खींचकर Infrastructureप्रोजेक्ट में (क्योंकि यह एक एंटिटी फ्रेमवर्क बेस्ड आइडेंटिफिकेशन सिस्टम का इस्तेमाल कर रहा है) के परिणामस्वरूप सर्कुलर रेफरेंस मिलेंगे, इसलिए यह दोनों तरफ जाने का रास्ता नहीं है।

क्या इसका कोई तरीका है ताकि मैं ASP.NET पहचान का उपयोग न करने के अलावा दो परतों के बीच स्वच्छ पृथक्करण रख सकूं?


1
क्या आप अपने कोर प्रोजेक्ट में IApplicationUser इंटरफ़ेस नहीं बना सकते हैं और इन्फ्रास्ट्रक्चर में कार्यान्वयन को बनाए रख सकते हैं? मेरी राय में, जब तक आप एक एपीआई नहीं बना रहे हैं या आपको रनटाइम पर इंटरफ़ेस कार्यान्वयन को स्वैप करने की आवश्यकता है, बस अपने सभी गैर यूआई कोड को एक परियोजना में रखें। विभिन्न परियोजनाओं का एक गुच्छा होने से सिर्फ ज्यादा लाभ के बिना आपके मानसिक और कोड प्रबंधन ओवरहेड में जुड़ जाता है।
मुर्तलपमैन

जवाबों:


12

आप एक उपयोगकर्ता वर्ग बना सकते हैं जिसका आपके मुख्य पुस्तकालय में ASP.NET पहचान से कोई लेना-देना नहीं है।

public class User {
    public Guid UserId { get; set; }
    public string UserName { get; set; }
    public string EmailAddress { get; set; }
    public string EmailAddressConfirmed { get; set; }
    public string PhoneNumber { get; set; }
    public string PhoneNumberConfirmed { get; set; }
    public string PasswordHash { get; set; }
    public string SecurityStamp { get; set; }

    ...

    public virtual ICollection<Role> Roles { get; set; }
    public virtual ICollection<UserClaim> UserClaims { get; set; }
    public virtual ICollection<UserLogin> UserLogins { get; set; }
}

यदि आप एंटिटी फ्रेमवर्क का उपयोग कर रहे हैं, तो अपनी संस्थाओं (वैकल्पिक) के लिए एक कॉन्फ़िगरेशन क्लास बनाएं।

internal class UserConfiguration : EntityTypeConfiguration<User>
{
    internal UserConfiguration()
    {
        ToTable("User");

        HasKey(x => x.UserId)
            .Property(x => x.UserId)
            .HasColumnName("UserId")
            .HasColumnType("uniqueidentifier")
            .IsRequired();

        Property(x => x.PasswordHash)
            .HasColumnName("PasswordHash")
            .HasColumnType("nvarchar")
            .IsMaxLength()
            .IsOptional();

        Property(x => x.SecurityStamp)
            .HasColumnName("SecurityStamp")
            .HasColumnType("nvarchar")
            .IsMaxLength()
            .IsOptional();

        Property(x => x.UserName)
            .HasColumnName("UserName")
            .HasColumnType("nvarchar")
            .HasMaxLength(256)
            .IsRequired();

        // EmailAddress, PhoneNumber, ...

        HasMany(x => x.Roles)
            .WithMany(x => x.Users)
            .Map(x =>
            {
                x.ToTable("UserRole");
                x.MapLeftKey("UserId");
                x.MapRightKey("RoleId");
            });

        HasMany(x => x.UserClaims)
            .WithRequired(x => x.User)
            .HasForeignKey(x => x.UserId);

        HasMany(x => x.UserLogins)
            .WithRequired(x => x.User)
            .HasForeignKey(x => x.UserId);
    }
}

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

वेब लेयर में, AppUser नामक एक वर्ग बनाएं (या यदि आप चुनते हैं तो दूसरा नाम)। इस वर्ग ASP.NET पहचान को लागू करना चाहिए IUser <TKey> इंटरफेस, जहां TKey (प्राथमिक कुंजी के लिए डेटा प्रकार है Guid ऊपर के उदाहरण में)।

public class AppUser : IUser<Guid>
{
    public AppUser()
    {
        this.Id = Guid.NewGuid();
    }

    public AppUser(string userName)
        : this()
    {
        this.UserName = userName;
    }

    public Guid Id { get; set; }
    public string UserName { get; set; }
    public string EmailAddress { get; set; }
    public string EmailAddressConfirmed { get; set; }
    public string PhoneNumber { get; set; }
    public string PhoneNumberConfirmed { get; set; }
    public string PasswordHash { get; set; }
    public string SecurityStamp { get; set; }
}

वेब प्रोजेक्ट में UserManager के सभी संदर्भों को UserManager <AppUser, Guide> में बदलें

अंत में, अपना खुद का यूजरस्टोर बनाएं । अनिवार्य रूप से, कस्टम उपयोगकर्तास्टोर AppUser ऑब्जेक्ट में ले जाएगा , इसे उपयोगकर्ता इकाई ऑब्जेक्ट में कनवर्ट करेगा , फिर इसे बनाए रखें । इन विधियों में से एक का एक उदाहरण नीचे दिखाया गया है:

public class UserStore : 
    IUserLoginStore<AppUser, Guid>, 
    IUserClaimStore<AppUser, Guid>, 
    IUserRoleStore<AppUser, Guid>, 
    IUserPasswordStore<AppUser, Guid>, 
    IUserSecurityStampStore<AppUser, Guid>, 
    IUserStore<AppUser, Guid>, 
    IDisposable
{
    private User MapFromAppUser(AppUser appUser)
    {
        if (appUser == null)
            return null;

        var userEntity = new User();

        PopulateUser(userEntity, appUser);

        return userEntity;
    }

    private void PopulateUser(User user, AppUser appUser)
    {
        user.UserId = appUser.Id;
        user.UserName = appUser.UserName;
        user.EmailAddress = appUser.EmailAddress;
        user.EmailAddressConfirmed = appUser.EmailAddressConfirmed;
        user.PhoneNumber = appUser.PhoneNumber;
        user.PhoneNumberConfirmed = appUser.PhoneNumberConfirmed;
        user.PasswordHash = appUser.PasswordHash;
        user.SecurityStamp = appUser.SecurityStamp;

        // First name, last name, ... 
    }

    #region IUserStore<AppUser, Guid> Members

    public Task CreateAsync(AppUser appUser)
    {
        if (appUser == null)
            throw new ArgumentNullException("appUser");

        var userEntity = MapFromAppUser(appUser);

        // Persist the user entity to database using a data repository.
        // I'll leave this to you.
    }

    ...

    #endregion
}

एक संभावित कार्यान्वयन का पूरा विवरण प्राप्त करने के लिए, यहां क्लिक करें

अंत में, यह आपकी पसंद है। इस कार्यान्वयन को बनाए रखने के लिए आपके द्वारा किए जाने वाले प्रयास की मात्रा को मापें, केवल अपने कोर लाइब्रेरी में आइडेंटिटी फ्रेमवर्क को संदर्भित करते हुए। व्यक्तिगत रूप से, मैंने इसे ऊपर वर्णित तरीके से करने के बारे में सोचा, हालांकि, मैंने ऐसा नहीं किया क्योंकि मुझे संभवतः हर बार ASP.NET पहचान फ्रेमवर्क के अद्यतन होने पर अपना कोड बदलना होगा।

उम्मीद है कि यह मदद करता है और आपके सवाल का जवाब देता है!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.