Asp.net পরিচয় এমভিসি 5 তে ভূমিকা তৈরি করা হচ্ছে


85

নতুন Asp.net পরিচয় সুরক্ষা ফ্রেমওয়ার্ক ব্যবহার সম্পর্কে খুব কম ডকুমেন্টেশন রয়েছে।

আমি চেষ্টা করতে পারি এবং একটি নতুন ভূমিকা তৈরি করতে এবং এতে একটি ব্যবহারকারীর যুক্ত করার চেষ্টা করতে পেরেছিলাম তা আমি একসাথে পেয়েছি ced আমি নিম্নলিখিতগুলি চেষ্টা করেছিলাম: এএসপি.এনইটি পরিচয়ের ভূমিকা যোগ করুন

যা দেখে মনে হচ্ছে এটি এই ব্লগ থেকে তথ্যটি পেয়েছে: এ্যাসপিএন পরিচয়ের সাথে একটি সাধারণ করণীয় অ্যাপ্লিকেশন তৈরি করা এবং ব্যবহারকারীদের করণীয় সম্পর্কিত করে

আমি কোডটি একটি ডেটাবেস ইনিশিয়ালাইজারে যুক্ত করেছি যা যখনই মডেল পরিবর্তন হয় তখনই চালিত হয়। এটি RoleExistsনিম্নলিখিত ত্রুটি সহ ফাংশনে ব্যর্থ :

System.InvalidOperationException mscorlib.dll এ ঘটেছে সত্তা টাইপ আইডেন্টিটি রোল বর্তমান প্রসঙ্গে মডেলের অংশ নয়।

protected override void Seed (MyContext context)
{
    var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context)); 
    var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));

    // Create Admin Role
    string roleName = "Admins";
    IdentityResult roleResult;

    // Check to see if Role Exists, if not create it
    if (!RoleManager.RoleExists(roleName))
    {
        roleResult = RoleManager.Create(new IdentityRole(roleName));
    }
}

কোন সাহায্য প্রশংসা করা হয়।

উত্তর:


26

আপনার MyContextক্লাসে স্বাক্ষর রয়েছে কিনা তা যাচাই করুন

public class MyContext : IdentityDbContext<MyUser>

বা

public class MyContext : IdentityDbContext

কোডটি আমার জন্য কাজ করছে, কোনও পরিবর্তন ছাড়াই !!!


4
আপনার জবাবের জন্য সবাইকে ধন্যবাদ। সবকিছু এখন কাজ করছে। প্রসঙ্গটি পরীক্ষা করা আমাকে সঠিক দিকে নিয়ে গেছে। যখন asp.net পরিচয় তৈরি হয়, এটি একটি নতুন প্রসঙ্গ তৈরি করে (অ্যাপ্লিকেশনবিবি কনটেক্সট) যা আইডেন্টিটিবিবি কনটেক্সট প্রসারিত করে। আমার কোডে আমি আমার মূল প্রসঙ্গটি উল্লেখ করছি যা আইডেন্টিটিবিবি কনটেক্সটকে প্রসারিত করে না। অন্য কারও যদি এই সমস্যা থাকে তবে আপনার প্রসঙ্গগুলি পরীক্ষা করুন এবং আপনি দু'টি ডাটাবেস দুর্ঘটনাক্রমে তৈরি করছেন না তা নিশ্চিত করতে আপনার APP_DATA ডিরেক্টরিটি ডাবল পরীক্ষা করে দেখুন।
colbyJax

74

এখানে আমরা যাচ্ছি:

var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));


   if(!roleManager.RoleExists("ROLE NAME"))
   {
      var role = new Microsoft.AspNet.Identity.EntityFramework.IdentityRole();
      role.Name = "ROLE NAME";
      roleManager.Create(role);

    }

4
এটি আমাকে সহায়তা করেছিল, বিশেষত যেহেতু আমি মাইগ্রেশন ব্যবহার করছিলাম না। আমি ড্রপক্রিয়েট ডেটাবেসএলওয়েস ব্যবহার করছি।
J86

আমার সমস্যাটি হ'ল আমি ভুল প্রসঙ্গটি ব্যবহার করছি। আমি দুটি সংযোগের স্ট্রিং তৈরি করেছি, একটি বলা হয়েছিল IdentityDbContextএবং অন্যটি আমি একটি কাস্টম প্রসঙ্গ ব্যবহার করছি, সুতরাং যখন আমি আপনার পরামর্শটি ব্যবহার করি তখন AppilcationDbContext()এটি কার্যকর হয়েছিল।
মেগামাইকু

var रोलম্যানেজার = নতুন রোলম্যানেজার <আইডেন্টিটি রোল> (নতুন রোলস্টোর <আইডেন্টিটি রোল> (ডিবি));
Nour Lababidi

25

ASP.NET পরিচয় ব্যবহার করে কীভাবে ভূমিকা তৈরি করতে, ভূমিকা পরিবর্তন করতে, ভূমিকা মুছতে এবং ভূমিকা পরিচালনা করতে হবে তার বর্ণনা দেওয়ার সম্পূর্ণ নিবন্ধটি এখানে। এটিতে ইউজার ইন্টারফেস, নিয়ামক পদ্ধতি ইত্যাদি রয়েছে

http://www.dotnetfunda.com/articles/show/2898/working-with-roles-in-aspnet-identity-for-mvc

আশা করি এই সহায়তাগুলি

ধন্যবাদ


4
আপনার ব্লগটি দুর্দান্ত, তবে
পুরানো

এটি ইতিমধ্যে এএসপি.নেট এমভিসি 5 এর জন্য (আপনি কী আপডেট আপডেট করছেন?)। আপনি নিবন্ধে উল্লিখিত গিটহাব লিঙ্ক থেকে উত্স কোডটি ডাউনলোড করতে পারেন।
শেও নারায়ণ

4
এর মধ্যে কয়েকটি ফাংশন সর্বশেষতম 2.2.0 থেকে অবমানিত বলে মনে হচ্ছে। 1) আমি 3 ইমেইল) কিভাবে পরিচয় recpatcha সংহত করার উপর কোন সুপারিশ কীভাবে আমি GUID থেকে প্রাথমিক কী পরিবর্তন করতে পারেন বর্তমান সংস্করণ 2) একই কোড ব্যবহার করতে পারেন প্রশংসা হবে j.mp/1nohaHe
aggie

15

ভিতরে ASP.NET 5 rc1-final , আমি নিম্নলিখিতটি করেছেন:

তৈরি করা হয়েছে ApplicationRoleManager( ApplicationUserটেমপ্লেট দ্বারা তৈরি যেমন একইভাবে )

public class ApplicationRoleManager : RoleManager<IdentityRole>
{
    public ApplicationRoleManager(
        IRoleStore<IdentityRole> store,
        IEnumerable<IRoleValidator<IdentityRole>> roleValidators,
        ILookupNormalizer keyNormalizer,
        IdentityErrorDescriber errors,
        ILogger<RoleManager<IdentityRole>> logger,
        IHttpContextAccessor contextAccessor)
        : base(store, roleValidators, keyNormalizer, errors, logger, contextAccessor)
    {
    }
}

করার ConfigureServicesমধ্যে Startup.cs, আমি এটা RoleManager হিসেবে নিজেকে যুক্ত

services.
    .AddIdentity<ApplicationUser, IdentityRole>()
    .AddRoleManager<ApplicationRoleManager>();

নতুন ভূমিকা তৈরি করার জন্য, Configureনিম্নলিখিতগুলি থেকে কল করুন :

public static class RoleHelper
{
    private static async Task EnsureRoleCreated(RoleManager<IdentityRole> roleManager, string roleName)
    {
        if (!await roleManager.RoleExistsAsync(roleName))
        {
            await roleManager.CreateAsync(new IdentityRole(roleName));
        }
    }
    public static async Task EnsureRolesCreated(this RoleManager<IdentityRole> roleManager)
    {
        // add all roles, that should be in database, here
        await EnsureRoleCreated(roleManager, "Developer");
    }
}

public async void Configure(..., RoleManager<IdentityRole> roleManager, ...)
{
     ...
     await roleManager.EnsureRolesCreated();
     ...
}

এখন, নিয়মগুলি ব্যবহারকারীর জন্য বরাদ্দ করা যেতে পারে

await _userManager.AddToRoleAsync(await _userManager.FindByIdAsync(User.GetUserId()), "Developer");

বা Authorizeবৈশিষ্ট্যে ব্যবহৃত হয়

[Authorize(Roles = "Developer")]
public class DeveloperController : Controller
{
}

services.AddIdentity<UserAuth, IdentityRole>().AddRoleManager<ApplicationRoleManager>() আমি এটি servicesসরাসরি যুক্ত করতে সক্ষম হইনি ।
অ্যালেক্স সি

4
@ অ্যালেক্স, দুঃখিত, আমার খারাপ। আমি এটি যথাসম্ভব সহজ রাখার চেষ্টা করেছি এবং অ্যাডআইডেন্টিটি সরিয়েছি। স্থির।
নথ্রো

4
সুতরাং, আমি সেই কোডটি একটি স্বতন্ত্র প্রকল্প github.com/AlexChesser/AspnetIdentitySample/commit/… এ যুক্ত করেছি এবং অ্যাস্পনেটরসগুলি সফলভাবে তৈরি হয় তবে কোনও কারণে পৃষ্ঠাগুলি 'হোয়াইটস্ক্রিন' হয়ে যায় (তবে আমি একটি 500 ত্রুটি অনুমান করি তবে স্ট্যাকট্রেস নেই) আপনি কি এই ইনস্টলড পৃষ্ঠাগুলি রেন্ডার করতে সক্ষম হয়েছেন?
অ্যালেক্স সি

ঠিক আছে - এই সংশোধন করা হয়েছে কমিট whitescreen ত্রুটি github.com/AlexChesser/AspnetIdentitySample/commit/... যে বিজ্ঞপ্তি EnsureRolesCreated আমি করেছি মধ্যে টাস্ক পরিবর্তে একটি অকার্যকর তা সুইচ।
অ্যালেক্স সি

4
'EnsureRolesCreated' ফিরে অকার্যকর অর্থ হতে পারে ভূমিকা নির্মিত নেই কনফিগারেশন শেষ করার আগে থাকার
nothrow

6

উপরের পিটার কোডের উন্নতি হিসাবে আপনি এটি ব্যবহার করতে পারেন:

   var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));

   if (!roleManager.RoleExists("Member"))
            roleManager.Create(new IdentityRole("Member"));

3

আমি যখন পিএফ স্টুলিনস্কি এবং ডেভ গর্ডনের কোড নমুনা ইএফ 6.0 এর সাথে ব্যবহার করছিলাম তখন আমার অ্যাপ্লিকেশনটি স্টার্টআপে ঝুলছিল। আমি বদলে গেছি:

var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));

প্রতি

var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(**context**));

আপনি বীজ পদ্ধতিতে যখন অন্য একটি উদাহরণ ইনস্ট্যান্ট করতে চান না যা বোঝায় ApplicationDBContext। এটি সম্ভবত আমার Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());নির্মাণকারীর মধ্যে আরও জটিল হয়েছিলApplicationDbContext


2

ভূমিকা দর্শন মডেল

public class RoleViewModel
{
    public string Id { get; set; }
    [Required(AllowEmptyStrings = false)]
    [Display(Name = "RoleName")]
    public string Name { get; set; }
}

নিয়ামক পদ্ধতি

    [HttpPost]
    public async Task<ActionResult> Create(RoleViewModel roleViewModel)
    {
       if (ModelState.IsValid)
       {
           var role = new IdentityRole(roleViewModel.Name);
           var roleresult = await RoleManager.CreateAsync(role);
           if (!roleresult.Succeeded)
           {
               ModelState.AddModelError("", roleresult.Errors.First());
               return View();
           }
           return RedirectToAction("some_action");
       }
       return View();
    }

1

ভূমিকাগুলি যুক্ত করার জন্য আমি আরেকটি সমাধান ভাগ করতে চেয়েছিলাম:

<h2>Create Role</h2>

@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<span class="label label-primary">Role name:</span>
<p>
    @Html.TextBox("RoleName", null, new { @class = "form-control input-lg" })
</p>
<input type="submit" value="Save" class="btn btn-primary" />
}

নিয়ামক:

    [HttpGet]
    public ActionResult AdminView()
    {
        return View();
    }

    [HttpPost]
    public ActionResult AdminView(FormCollection collection)
    {
        var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));

        if (roleManager.RoleExists(collection["RoleName"]) == false)
        {
            Guid guid = Guid.NewGuid();
            roleManager.Create(new IdentityRole() { Id = guid.ToString(), Name = collection["RoleName"] });
        }
        return View();
    }

1

আপনি যদি নতুন এএসপিএন ওয়েব অ্যাপ্লিকেশন নির্বাচন করেন এবং স্বতন্ত্রকরণ হিসাবে স্বতন্ত্র ব্যবহারকারীর অ্যাকাউন্টগুলি নির্বাচন করেন এবং ভূমিকার সাথে ব্যবহারকারীদের তৈরি করার চেষ্টা করেন তবে তৈরি করা ডিফল্ট টেম্পলেটটি যদি আপনি এখানে ব্যবহার করেন the অ্যাকাউন্ট কন্ট্রোলারের রেজিস্টার পদ্ধতিতে যা [এইচটিটিপিপোস্ট] ব্যবহার করে বলা হয়, নিম্নলিখিত লাইনগুলি এতে যুক্ত করুন if condition

Microsoft.AspNet.Identity.EntityFramework ব্যবহার করে;

var user = new ApplicationUser { UserName = model.Email, Email = model.Email };

var result = await UserManager.CreateAsync(user, model.Password);

if (result.Succeeded)
{
  var roleStore = new RoleStore<IdentityRole>(new ApplicationDbContext());
  var roleManager = new RoleManager<IdentityRole>(roleStore);
  if(!await roleManager.RoleExistsAsync("YourRoleName"))
     await roleManager.CreateAsync(new IdentityRole("YourRoleName"));

  await UserManager.AddToRoleAsync(user.Id, "YourRoleName");
  await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
  return RedirectToAction("Index", "Home");
}

এটি প্রথমে আপনার ডাটাবেসে একটি ভূমিকা তৈরি করবে এবং তারপরে সদ্য নির্মিত ব্যবহারকারীকে এই ভূমিকাতে যুক্ত করবে।



0

ভূমিকা পালনের জন্য আমি যে পদ্ধতিটি ব্যবহার করছি সেটির নীচে নীচে, কোডগুলিতে তাদের ব্যবহারকারীদেরকে নিয়োগের বিষয়টিও তালিকাভুক্ত রয়েছে। নীচের কোডটি মাইগ্রেশন ফোল্ডারে "কনফিগারেশন। সি" তে রয়েছে।

string [] roleNames = { "role1", "role2", "role3" };
var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));

                IdentityResult roleResult;
                foreach(var roleName in roleNames)
                {
                    if(!RoleManager.RoleExists(roleName))
                    {
                        roleResult = RoleManager.Create(new IdentityRole(roleName));
                    }
                }
                var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
                UserManager.AddToRole("user", "role1");
                UserManager.AddToRole("user", "role2");
                context.SaveChanges();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.