এমভিসি 5 বীজ ব্যবহারকারী এবং ভূমিকা


95

আমি নতুন এমভিসি 5 নিয়ে খেলছি, আমার কাছে কয়েকটি মডেল, নিয়ামক এবং কোড প্রথম মাইগ্রেশন ব্যবহার করে সেটআপ রয়েছে।

আমার প্রশ্ন আমি ব্যবহারকারী এবং ভূমিকা কীভাবে বদ্ধ করব? আমি বর্তমানে কনফিগারেশন। সিগুলিতে আমার বীজ পদ্ধতিতে কিছু তথ্য রেফার করি। তবে এটি আমার কাছে মনে হচ্ছে যে ব্যবহারকারী এবং ভূমিকাগুলির সারণী তৈরি করা হয় না যতক্ষণ না কোনও কিছু প্রথমে অ্যাকাউন্টকন্ট্রোলারে আঘাত না করে।

আমার কাছে বর্তমানে দুটি সংযোগের স্ট্রিং রয়েছে যাতে আমি আমার প্রমাণীকরণ থেকে আমার ডেটা আলাদা আলাদা ডাটাবেসে আলাদা করতে পারি।

আমি কীভাবে অন্যদের সাথে ব্যবহারকারীর ভূমিকা, ইত্যাদি ইত্যাদি টেবিলগুলি পপুলেশন করতে পারি? এবং অ্যাকাউন্ট কন্ট্রোলার আঘাত করা হয় না যখন?


উত্তর:


183

এখানে স্বাভাবিক বীজ পদ্ধতির উদাহরণ রয়েছে:

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");
    }
}

আমি প্যাকেজ-পরিচালক "আপডেট-ডাটাবেস" ব্যবহার করেছি। ডিবি এবং সমস্ত সারণী ডেটা সহ তৈরি এবং বীজযুক্ত হয়েছিল।


4
কনফিগারেশন ক্লাসের বীজ পদ্ধতিতে। কনফিগারেশন সক্ষম-মাইগ্রেশন সক্ষম করার জন্য ডিফল্ট শ্রেণীর নাম তবে আপনি এটি পরিবর্তন করতে পারেন।
ভালিন

4
আপনার প্যাকেজ ম্যানেজার কনসোল 'সক্ষম-মাইগ্রেশন' ব্যবহার করা উচিত। এটি আপনার জন্য বীজ পদ্ধতি সহ কনফিগারেশন ক্লাস তৈরি করবে।
ভালিন

4
@ জাপানোলিকা মাইগ্রেশনগুলি ব্যবহার করা এত সহজ is এটি আপনাকে আপনার টেবিলগুলি পুনরায় তৈরি না করে আপনার টেবিলগুলি সম্পাদনা করার অনুমতি দেয়। নিউগেট প্যাকেজ ম্যানেজার কনসোল ব্যবহার করে নিজেকে পরিচিত করার জন্য কেবলমাত্র তিনটি আদেশ রয়েছে। মাইগ্রেশন, অ্যাড-মাইগ্রেশন এবং আপডেট-ডেটাবেস সক্ষম করুন। সহজ পিয়াজি
yardpenalty.com

10
আমি আক্ষরিকভাবে একটি নতুন এমভিসি 5 ওয়েব অ্যাপ্লিকেশনটিতে আমার বীজ পদ্ধতিতে এই কোডটি অনুলিপি করে আটকিয়েছি এবং তারপরে প্যাকেজ ম্যানেজার কনসোলে "আপডেট-ডাটাবেস" চালিয়েছি। এটি ভূমিকা যোগ করে (আমি এটি এসপনেটরস টেবিলটিতে দেখতে পাচ্ছি), তবে এটি লাইন ম্যানেজারের সাথে যুক্ত হলে অ্যাডডোটোরোল (ইউজার.আইডি, "অ্যাপএডমিন") পেয়েছি ত্রুটি বার্তাটি "ইউজারআইড পাওয়া যায় নি।" আমি কী অনুপস্থিত তা যদি আপনার কোনও ধারণা থাকে তবে আমি এই তথ্যটির অনেক প্রশংসা করব।
টম রেগান

4
মিসড context.Users.Add(user);মধ্যে manager.Create(user, "ChangeItAsap!");এবং manager.AddToRole(user.Id, "AppAdmin");। সুতরাং নবজাতকের ব্যবহারকারীর ব্যবহারকারীর নাম নেই d
ApceH ভণ্ডামি

15

এটি একটি সামান্য সংযোজন, তবে যার কাছে "ব্যবহারকারীর পরিচয় পাওয়া যায় নি।" বীজ চেষ্টা করার সময় বার্তা: (টম রেগান মন্তব্যগুলিতে এই প্রশ্নটি করেছিলেন এবং আমি নিজেই এটির জন্য কিছুক্ষণ আটকে ছিলাম)

এর অর্থ হ'ল ম্যানেজার.ক্রিয়েট (ব্যবহারকারী, "চেঞ্জটাইটস্যাপ!") সফল হয়নি। এটির ভিন্ন কারণ থাকতে পারে তবে আমার জন্য এটি ছিল কারণ আমার পাসওয়ার্ডটির বৈধতা সফল হয়নি।

আমার একটি কাস্টম পাসওয়ার্ডিয়ালিডিটার ছিল, যা ডেটাবেস সিড করার সময় কল করা হয়নি, সুতরাং যে বৈধতা রুলস আমি ব্যবহার করতাম (ডিফল্ট 6 এর পরিবর্তে দৈর্ঘ্য 4) প্রযোজ্য হয়নি। আপনার পাসওয়ার্ড (এবং এই বিষয়টির জন্য অন্যান্য সমস্ত ক্ষেত্রগুলি) যাচাইকরণ পাস করছে তা নিশ্চিত করুন।


7
আমার "ইউজারআইডি পাওয়া যায় নি" সমস্যা হওয়ায় এটি আমাকে সহায়তা করেছিল helped আমি নিম্নলিখিত কোড সহ এটি ট্র্যাক করতে সক্ষম হয়েছি: IdentityResult result = manager.Create(user, "ChangeItAsap!"); if (result.Succeeded == false) { throw new Exception(result.Errors.First()); }
স্টিভ উইলফোর্ড

মন্তব্যটি দুর্দান্ত, এটি আমাকে দিয়েছে 'ব্যবহারকারীর নাম ডেমো ব্যবহারকারীর অবৈধ, কেবলমাত্র অক্ষর বা সংখ্যা থাকতে পারে।' কোনও অনুপস্থিত ব্যবহারকারীর সাথে অস্পষ্টভাবে ব্যর্থ হওয়ার পরিবর্তে আইডি
ডগজম্যাকডোনাল্ড

আমি আমার পাসওয়ার্ড যাচাইয়ের নিয়ম খুব বেশি কাজ করে না, কোন ধারণা?
ব্যবহারকারী1686407

15

এটি ভ্যালিন উত্তরের আমার পদ্ধতি বেস, আমি ডিবিতে ভূমিকা যুক্ত করেছি এবং ব্যবহারকারীর জন্য পাসওয়ার্ড যুক্ত করেছি। এই কোডটি Seed()মাইগ্রেশন> কনফিগারেশন.সি.এসগুলিতে পদ্ধতিতে স্থাপন করা হয়েছে ।

// 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);
    }

4
দুর্দান্ত জিনিস, তবে আপনি একটি গুরুত্বপূর্ণ জিনিস মিস করেছেন। আপনাকে ইউজার.সিকিউরিটিস্ট্যাম্প = গাইড N নিউগুইড () টিউস্ট্রিং () যুক্ত করতে হবে বা লগইনে আপনি একটি ত্রুটি পাবেন।
এডি সাদা

ধন্যবাদ. আমি সেই বৈশিষ্ট্যটি ব্যবহার করি নি তবে আমি এটি আমার উত্তরে যুক্ত করেছি।
মিঃ তাংজাই

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);
  }
}

4
আমি আমার অ্যাপ্লিকেশন ব্যবহারকারীকে একটি ইন্টার টাইপ করা আইডি সম্পত্তি হিসাবে কাস্টমাইজ করেছি। আপনার পদ্ধতির একমাত্র আমি আমার কাস্টম ব্যবহারকারী এবং রোলস্টোরগুলির সাথে কাজ করতে পারি, ধন্যবাদ!
মাইক ডিভেন্নি

4
এই বিট একটি দেখুন ধারণাগত বিন্দু থেকে সম্পূর্ণরূপে ভুল: Task.Run(async () => { await SeedAsync(context); }).Wait();। আপনি বরং লিখবেন SeedAsync(context).GetAwait().GetResult();যা প্রান্তিকভাবে ভাল।
তানভীর বদর

2

দেখে মনে হচ্ছে যে তারা এমভিসি 5 তে প্রমাণীকরণের কাজ করার পদ্ধতি পরিবর্তন করে, আমার গ্লোবাল.এক্সএক্স.এসকে নিম্নলিখিতটির সাথে পরিবর্তন করেছে!

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

আপনার অভিবাসন কনফিগারেশনে এই কোডটি লিখুন।

দ্রষ্টব্য: কনফিগারেশন ক্লাসে অ্যাপ্লিকেশনবিবি কনটেক্সট ব্যবহার করুন।

    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" }
            );


    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.