Asp.net Identity MVC 5 में रोल्स बनाना


85

नए Asp.net Identity Security Framework का उपयोग करने के बारे में बहुत कम प्रलेखन है।

मैंने एक साथ पाईक किया है जो मैं कोशिश कर सकता हूं और एक नई भूमिका बना सकता हूं और इसमें एक उपयोगकर्ता जोड़ सकता हूं। मैंने निम्नलिखित की कोशिश की: ASP.NET पहचान में भूमिका जोड़ें

ऐसा लगता है कि यह इस ब्लॉग से जानकारी प्राप्त कर सकता है: asp.net पहचान और उपयोगकर्ताओं को करने के लिए सहयोगी के साथ एक सरल करने के लिए आवेदन करना

मैंने एक डेटाबेस आरंभकर्ता के लिए कोड जोड़ा है जो कि जब भी मॉडल बदलता है तो चलाया जाता है। यह RoleExistsनिम्न त्रुटि वाले फ़ंक्शन पर विफल रहता है :

System.InvalidOperationException mscorlib.dll में हुई इकाई प्रकार IdentityRole वर्तमान संदर्भ के लिए मॉडल का हिस्सा नहीं है।

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 पहचान बनाई जाती है, तो यह एक नया संदर्भ (ApplicationDbContext) बनाता है जो IdentityDbContext का विस्तार करता है। मेरे कोड में, मैं अपने मूल संदर्भ का उल्लेख कर रहा था, जिसने IdentityDbContext का विस्तार नहीं किया था। यदि किसी और के पास यह समस्या है, तो अपने संदर्भों की जांच करें और अपने 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);

    }

2
इससे मुझे मदद मिली, खासकर जब से मैं माइग्रेशन का उपयोग नहीं कर रहा था। मैं DropCreateDatabaseAlways का उपयोग कर रहा हूं।
J86

मेरी समस्या यह थी कि मैं गलत संदर्भ का उपयोग कर रहा था। मैंने दो कनेक्शन तार बनाए थे, एक को बुलाया IdentityDbContextऔर दूसरा जिसे मैं कस्टम संदर्भ का उपयोग कर रहा था, इसलिए जब मैंने आपके सुझाव का उपयोग किया, तो AppilcationDbContext()यह काम किया।
मेगाकाइकू

var भूमिका प्रबंधक = नया भूमिका प्रबंधक <पहचान रोल (नया रोलस्टोर <पहचान रोल> (डीबी));
नूर लबबिदी

25

ASP.NET आइडेंटिटी का उपयोग करके भूमिका बनाने, भूमिकाओं को संशोधित करने, भूमिकाओं को हटाने और भूमिकाओं को प्रबंधित करने का तरीका बताने वाला पूरा लेख यहाँ दिया गया है। इसमें यूजर इंटरफेस, कंट्रोलर तरीके आदि भी शामिल हैं।

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

आशा है कि यह मददगार है

धन्यवाद


1
आपका ब्लॉग अच्छा है, लेकिन तारीख से बाहर, आप
एग्री

ASP.NET MVC 5 के लिए इसकी पहले से ही (क्या अद्यतन आप एगी के लिए देख रहे हैं?)। आप लेख में निर्दिष्ट GitHub लिंक से स्रोत कोड डाउनलोड कर सकते हैं।
श्यो नारायण

1
उन कार्यों में से कुछ नवीनतम में 2.2.0 से पदावनत लगते हैं। 1) क्या मैं वर्तमान संस्करण में एक ही कोड का उपयोग कर सकता हूं 2) मैं गाइड से ईमेल में प्राथमिक कुंजी को कैसे बदल सकता हूं 3) पहचान के साथ पुनरावृत्ति को कैसे एकीकृत किया जाए, इस पर कोई सिफारिश की सराहना की जाएगी 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सीधे जोड़ने में सक्षम नहीं था ।
एलेक्स सी

2
@AlexC, क्षमा करें, मेरा बुरा। मैंने इसे यथासंभव सरल रखने की कोशिश की और AddIdentity को हटा दिया। फिक्स्ड।
नॉट्रो

1
तो, मैंने उस कोड को एक स्टैंडअलोन प्रोजेक्ट github.com/AlexChesser/AspnetIdentitySample/commit/… में जोड़ दिया है और AspnetRoles सफलतापूर्वक तैयार हो जाते हैं, लेकिन किसी कारण से, पृष्ठ 'व्हाट्सएप' बन जाते हैं (मैं एक 500 त्रुटि मान सकता हूं, लेकिन कोई स्टैकट्रेस) क्या आप इस स्थापित के साथ पृष्ठों को प्रस्तुत करने में सक्षम हैं?
एलेक्स सी

ठीक है - यह प्रतिबद्ध व्हिटस्क्रीन त्रुटि को ठीक करता है github.com/AlexChesser/AspnetIdentitySample/commit/… ध्यान दें कि EnsureRolesCreated के भीतर मैंने टास्क के बजाय इसे एक शून्य पर स्विच कर दिया है।
एलेक्स सी

1
''ureureRolesCreated' 'रिटर्निंग शून्य होने का अर्थ यह हो सकता है कि कॉन्फ़िगरेशन खत्म होने से पहले भूमिकाएँ नहीं बनाई गई हैं
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

मेरा आवेदन स्टार्टअप पर लटका हुआ था जब मैंने EF 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

यदि आप एक नए ASP.net वेब एप्लिकेशन का चयन करते समय बनाए जाने वाले डिफ़ॉल्ट टेम्पलेट का उपयोग कर रहे हैं और प्रमाणीकरण के रूप में व्यक्तिगत उपयोगकर्ता खातों का चयन किया और रोल्स के साथ उपयोगकर्ताओं को बनाने का प्रयास कर रहे हैं तो यहां समाधान है। अकाउंट कंट्रोलर के रजिस्टर मेथड में जिसे [HttpPost] का उपयोग करते हुए कहा जाता है, निम्नलिखित पंक्तियों को जोड़ते हैं 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

मेरे द्वारा भूमिकाओं को बनाने के लिए उपयोग की जाने वाली विधि नीचे है, उन्हें कोड में उपयोगकर्ताओं को निर्दिष्ट करना भी सूचीबद्ध है। नीचे का कोड माइग्रेशन फ़ोल्डर में "configuration.cs" में है।

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