MVC 5 बीज उपयोगकर्ता और भूमिकाएँ


95

मैं नए एमवीसी 5 के साथ खेल रहा हूं, मेरे पास कुछ मॉडल, कंट्रोलर और व्यू सेटअप हैं जो कोड फर्स्ट माइग्रेशन का उपयोग कर रहे हैं।

मेरा सवाल यह है कि मैं उपयोगकर्ताओं और भूमिकाओं को कैसे बीज सकता हूं? मैं वर्तमान में कॉन्फ़िगरेशन में अपनी सीड विधि में कुछ संदर्भ डेटा बीज देता हूं। लेकिन यह मुझे दिखता है कि उपयोगकर्ता और रोल्स टेबल तब तक नहीं बनते हैं जब तक कि कुछ पहले अकाउंटकंट्रोलर को हिट न कर दे।

मेरे पास वर्तमान में दो कनेक्शन स्ट्रिंग्स हैं ताकि मैं अपने डेटा को अपने प्रमाणीकरण से अलग-अलग डेटाबेस में अलग कर सकूं।

मैं अपने अन्य लोगों के साथ उपयोगकर्ता, भूमिकाएं आदि कैसे प्राप्त कर सकता हूं? और नहीं जब खाता नियंत्रक मारा जाता है?


जवाबों:


182

यहाँ सामान्य बीज दृष्टिकोण का उदाहरण दिया गया है:

protected override void Seed(SecurityModule.DataContexts.IdentityDb context)
{
    if (!context.Roles.Any(r => r.Name == "AppAdmin"))
    {
        var store = new RoleStore<IdentityRole>(context);
        var manager = new RoleManager<IdentityRole>(store);
        var role = new IdentityRole { Name = "AppAdmin" };

        manager.Create(role);
    }

    if (!context.Users.Any(u => u.UserName == "founder"))
    {
        var store = new UserStore<ApplicationUser>(context);
        var manager = new UserManager<ApplicationUser>(store);
        var user = new ApplicationUser {UserName = "founder"};

        manager.Create(user, "ChangeItAsap!");
        manager.AddToRole(user.Id, "AppAdmin");
    }
}

मैंने पैकेज-मैनेजर "अपडेट-डेटाबेस" का उपयोग किया। DB और सभी तालिकाएँ बनाई गईं और डेटा के साथ सीड की गईं।


3
विन्यास वर्ग के बीज विधि के लिए। सक्षम-माइग्रेशन के लिए कॉन्फ़िगरेशन डिफ़ॉल्ट श्रेणी का नाम है, लेकिन आप इसे बदल सकते हैं।
वैलिन

3
आपको 'सक्षम-माइग्रेशन'इन पैकेज मैनेजर कंसोल का उपयोग करना चाहिए। यह आपके लिए बीज विधि के साथ कॉन्फ़िगरेशन क्लास बनाएगा।
वेलिन

4
@Zapnologica माइग्रेशन का उपयोग करना इतना आसान है। यह आपको अपनी तालिकाओं को फिर से बनाए बिना अपनी तालिकाओं को संपादित करने की भी अनुमति देता है। केवल तीन कमांड हैं जिन्हें आपको NuGet पैकेज मैनेजर कंसोल का उपयोग करके खुद को परिचित करने की आवश्यकता है। सक्षम करें-माइग्रेशन, ऐड-माइग्रेशन और अपडेट-डेटाबेस। आसान मोर।
yaspenalty.com

10
मैंने सचमुच इस कोड को एक नए mvc 5 वेब एप्लिकेशन में अपने सीड मेथड में कॉपी और पेस्ट किया, और फिर पैकेज मैनेजर कंसोल में "अपडेट-डेटाबेस" चलाया। यह भूमिका जोड़ता है (मैं इसे AspNetRoles तालिका में देख सकता हूं), लेकिन जब यह लाइन प्रबंधक की बात आती है। AddToRole (user.Id, "AppAdmin") मुझे त्रुटि संदेश मिलता है "UserId नहीं मिला।" यदि आपके पास कोई विचार है जो मुझे याद आ रहा है तो मैं जानकारी की सराहना करूंगा।
टॉम रेगन

2
और के context.Users.Add(user);बीच छूटा । तो नवजात उपयोगकर्ता User.Id नहीं है। manager.Create(user, "ChangeItAsap!");manager.AddToRole(user.Id, "AppAdmin");
ApceH Hypocrite

15

यह एक छोटा सा जोड़ है, लेकिन किसी को भी "UserId नहीं मिला है।" संदेश जब बीज की कोशिश कर रहा है: (टॉम रेगन की टिप्पणियों में यह सवाल था, और मैं उस पर खुद थोड़ी देर के लिए अटक गया था)

इसका मतलब यह है कि प्रबंधक। बनाएँ (उपयोगकर्ता, "ChangeItAsap!") सफल नहीं था। इसका एक अलग कारण हो सकता है, लेकिन मेरे लिए यह इसलिए था क्योंकि मेरा पासवर्ड इसकी मान्यता को सफल नहीं कर रहा था।

मेरे पास एक कस्टम पासवर्डवैलिडेटर था, जिसे डेटाबेस को सीडिंग करते समय नहीं बुलाया जा रहा था, इसलिए मेरे द्वारा उपयोग किए जाने वाले सत्यापन नियम (डिफ़ॉल्ट 6 के बजाय 4 मिनट) में लागू नहीं होते थे। सुनिश्चित करें कि आपका पासवर्ड (और उस मामले के अन्य सभी क्षेत्र) सत्यापन पारित कर रहा है।


7
इससे मुझे मदद मिली क्योंकि मैं "UserId नहीं मिला" मुद्दा बना रहा था। मैं इसे निम्नलिखित कोड के साथ ट्रैक करने में कामयाब रहा: IdentityResult result = manager.Create(user, "ChangeItAsap!"); if (result.Succeeded == false) { throw new Exception(result.Errors.First()); }
स्टीव विल्फोर्ड

यह टिप्पणी उत्कृष्ट है, इसने मुझे दिया 'उपयोगकर्ता नाम डेमो उपयोगकर्ता अमान्य है, केवल अक्षर या अंक हो सकते हैं।' एक लापता userId के साथ अस्पष्ट रूप से असफल होने के बजाय
dougajmcdonald

मैंने पाया कि मेरा पासवर्ड सत्यापन नियम भी काम नहीं कर रहा है, कोई विचार?
user1686407

15

यह वेलिन उत्तर पर मेरी विधि का आधार है, मैंने उपयोगकर्ता के लिए db और अतिरिक्त पासवर्ड में भूमिकाएँ जोड़ी हैं। इस कोड को Seed()विधि में Migrations> Configurations.cs में रखा गया है ।

// role (Const.getRoles() return string[] whit all roles)

    var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
    for (int i = 0; i < Const.getRoles().Length; i++)
    {
        if (RoleManager.RoleExists(Const.getRoles()[i]) == false)
        {
            RoleManager.Create(new IdentityRole(Const.getRoles()[i]));
        }
    }

// user

    var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
    var PasswordHash = new PasswordHasher();
    if (!context.Users.Any(u => u.UserName == "admin@admin.net"))
    {
        var user = new ApplicationUser
        {
             UserName = "admin@admin.net",
             Email = "admin@admin.net",
             PasswordHash = PasswordHash.HashPassword("123456")
         };

         UserManager.Create(user);
         UserManager.AddToRole(user.Id, Const.getRoles()[0]);
    }

6

यहाँ मेरे पास एक बहुत ही आसान, साफ और चिकना घोल है।

 protected override void Seed(UserContext context)
    { 
        //Step 1 Create the user.
        var passwordHasher = new PasswordHasher();
        var user = new IdentityUser("Administrator");
        user.PasswordHash = passwordHasher.HashPassword("Admin12345");
        user.SecurityStamp = Guid.NewGuid().ToString();

        //Step 2 Create and add the new Role.
        var roleToChoose = new IdentityRole("Admin");
        context.Roles.Add(roleToChoose);

        //Step 3 Create a role for a user
        var role = new IdentityUserRole();
        role.RoleId = roleToChoose.Id;
        role.UserId = user.Id;

         //Step 4 Add the role row and add the user to DB)
        user.Roles.Add(role);
        context.Users.Add(user);
    }

1
अच्छी बात है, लेकिन यू एक महत्वपूर्ण बात याद आती है। आपको user.SecurityStamp = Guide.NewGuid ()। ToString () जोड़ना होगा या आपको लॉगिन पर एक त्रुटि मिलेगी।
एड़ी सफेद

धन्यवाद। मैंने उस सुविधा का उपयोग नहीं किया लेकिन मैंने इसे अपने उत्तर में जोड़ लिया है।
श्री तंगजई 15

4
protected override void Seed(ApplicationDbContext context)
{
  SeedAsync(context).GetAwaiter().GetResult();
}

private async Task SeedAsync(ApplicationDbContext context)
{
  var userManager = new ApplicationUserManager(new UserStore<ApplicationUser, ApplicationRole, int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>(context));
  var roleManager = new ApplicationRoleManager(new RoleStore<ApplicationRole, int, ApplicationUserRole>(context));

  if (!roleManager.Roles.Any())
  {
    await roleManager.CreateAsync(new ApplicationRole { Name = ApplicationRole.AdminRoleName });
    await roleManager.CreateAsync(new ApplicationRole { Name = ApplicationRole.AffiliateRoleName });
  }

  if (!userManager.Users.Any(u => u.UserName == "shimmy"))
  {
    var user = new ApplicationUser
    {
      UserName = "shimmy",
      Email = "shimmy@gmail.com",
      EmailConfirmed = true,
      PhoneNumber = "0123456789",
      PhoneNumberConfirmed = true
    };

    await userManager.CreateAsync(user, "****");
    await userManager.AddToRoleAsync(user.Id, ApplicationRole.AdminRoleName);
  }
}

1
मैंने अपने ApplicationUser को एक int टाइप आईडी प्रॉपर्टी के लिए कस्टमाइज़ किया है। आपका दृष्टिकोण केवल वही है जो मुझे मेरे कस्टम उपयोगकर्ता और रोलस्टोर्स के साथ काम करने के लिए मिल सकता है, धन्यवाद!
माइक डेवेनी

1
यह एक वैचारिक दृष्टिकोण से पूरी तरह से गलत है Task.Run(async () => { await SeedAsync(context); }).Wait();:। आपको बल्कि लिखना चाहिए SeedAsync(context).GetAwait().GetResult();जो थोड़ा बेहतर है।
तनवीर बदर

2

ऐसा लगता है कि उन्होंने MVC5 में प्रमाणीकरण के काम करने के तरीके को बदल दिया है, मेरे Global.asax.cs को निम्न चाल में बदल दिया है!

using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

using System.Threading.Tasks;
using MvcAuth.Models;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using System.Threading;
using Microsoft.AspNet.Identity.EntityFramework;

namespace MvcAuth
{
    public class MvcApplication : System.Web.HttpApplication
    {
        async Task<bool> AddRoleAndUser()
        {
            AuthenticationIdentityManager IdentityManager = new AuthenticationIdentityManager(
                new IdentityStore(new ApplicationDbContext()));

            var role = new Role("Role1");
            IdentityResult result = await IdentityManager.Roles.CreateRoleAsync(role, CancellationToken.None);
            if (result.Success == false)
                return false;

            var user = new ApplicationUser() { UserName = "user1" };
            result = await IdentityManager.Users.CreateLocalUserAsync(user, "Password1");
            if (result.Success == false)
                return false;

            result = await IdentityManager.Roles.AddUserToRoleAsync(user.Id, role.Id, CancellationToken.None);
            return result.Success;
        }

        protected async void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            bool x = await AddRoleAndUser();
        }
    }
}

9
यह उत्तर अब प्रासंगिक नहीं है क्योंकि ASP.NET आइडेंटिटी एपीआई बदल गया है।
जोश मैककिनिन

@ जोश मैकेरीन क्या आपके पास एक बेहतर उपाय है? कृपया साझा करें
विक्टर.उडक

2

इस कोड को अपने माइग्रेशन कॉन्फ़िगरेशन में लिखें।

नोट: कॉन्फ़िगरेशन क्लास में ApplicationDbContext का उपयोग करें।

    internal sealed class Configuration : DbMigrationsConfiguration<ApplicationDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = false;
    }

    protected override void Seed(ApplicationDbContext context)
    {
        //  This method will be called after migrating to the latest version.

        //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
        //  to avoid creating duplicate seed data.
                   context.Roles.AddOrUpdate(p =>
            p.Id,
                new IdentityRole { Name = "Admins"},
                new IdentityRole { Name = "PowerUsers" },
                new IdentityRole { Name = "Users" },
                new IdentityRole { Name = "Anonymous" }
            );


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