Asp.net Identity MVC 5'te Rol Oluşturma


85

Yeni Asp.net Identity Security Framework kullanımıyla ilgili çok az belge var.

Deneyip yeni bir Rol oluşturmak ve ona bir Kullanıcı eklemek için elimden geleni yaptım. Aşağıdakileri denedim: ASP.NET Identity'de rol ekle

Bu blogdan bilgi almış gibi görünen: asp.net kimliği ile basit bir yapılacaklar uygulaması oluşturmak ve kullanıcıları yapılacak işler ile ilişkilendirmek

Kodu, model her değiştiğinde çalışan bir Veritabanı Başlatıcıya ekledim. RoleExistsAşağıdaki hatayla işlevde başarısız olur :

System.InvalidOperationException mscorlib.dll'de oluştu IdentityRole varlık türü, geçerli bağlam için modelin bir parçası değil.

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

Herhangi bir yardım takdir edilmektedir.

Yanıtlar:


26

MyContextSınıfınızın aşağıdaki imzasına sahip olduğunuzu doğrulayın

public class MyContext : IdentityDbContext<MyUser>

Veya

public class MyContext : IdentityDbContext

Kod, herhangi bir değişiklik yapmadan benim için çalışıyor !!!


4
Cevaplarınız için herkese teşekkürler. Artık her şey çalışıyor. Bağlamı kontrol etmek beni doğru yöne götürdü. Asp.net kimliği oluşturulduğunda, IdentityDbContext'i genişleten yeni bir bağlam (ApplicationDbContext) oluşturur. Kodumda, IdentityDbContext'i genişletmeyen orijinal bağlamıma atıfta bulunuyordum. Başka biri bu sorunu yaşıyorsa, yanlışlıkla iki veritabanı oluşturmadığınızdan emin olmak için bağlamlarınızı kontrol edin ve APP_DATA dizininizi iki kez kontrol edin.
colbyJax

74

İşte başlıyoruz:

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
Bu bana yardımcı oldu, özellikle Migration kullanmadığım için. DropCreateDatabaseAlways kullanıyorum.
J86

Benim sorunum, yanlış bağlamı kullanmamdı. İki bağlantı dizisi oluşturmuştum, biri aranmış, diğeri IdentityDbContextözel bir bağlam kullanıyordum, bu yüzden önerinizi kullandığımda AppilcationDbContext()işe yaradı.
megamaiku

var roleManager = new RoleManager <IdentityRole> (yeni RoleStore <IdentityRole> (db));
Nour Lababidi

25

ASP.NET Identity kullanarak rollerin nasıl oluşturulacağını, rollerin nasıl değiştirileceğini, rollerin nasıl silineceğini ve rollerin nasıl yönetileceğini açıklayan tam makale burada. Bu ayrıca Kullanıcı arayüzü, kontrolör yöntemleri vb. İçerir.

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

Umarım bu yardımcı olur

Teşekkürler


1
Blogunuz güzel, ancak güncel değil, hesap denetleyicisini güncelleyebilir misiniz
aggie

Zaten ASP.NET MVC 5 için (Aggie için hangi güncellemeyi arıyorsunuz?). Kaynak kodunu makalede belirtilen GitHub bağlantısından indirebilirsiniz.
Sheo Narayan

1
Bu işlevlerden bazıları en son 2.2.0'dan kaldırılmış gibi görünüyor. 1) mevcut sürümde aynı kodu kullanabilir miyim 2) birincil anahtarı Guid'den e-postaya nasıl değiştirebilirim 3) recpatcha'nın Kimlik ile nasıl entegre edileceğine dair herhangi bir öneri j.mp/1nohaHe
aggie

15

İçinde ASP.NET 5 rc1-finalaşağıdakileri yaptım:

Oluşturuldu ApplicationRoleManager( ApplicationUserşablon tarafından oluşturulana benzer şekilde )

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

To ConfigureServicesin Startup.cs, ben roleManager olarak eklendi

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

Yeni Roller oluşturmak için Configureaşağıdakilerden arayın :

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

Artık kurallar kullanıcıya atanabilir

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

Veya Authorizeöznitelikte kullanılır

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

services.AddIdentity<UserAuth, IdentityRole>().AddRoleManager<ApplicationRoleManager>()servicesDoğrudan ekleyemedim .
Alex C

2
@AlexC, Üzgünüm benim hatam. Mümkün olduğunca basit tutmaya çalıştım ve AddIdentity'yi kaldırdım. Sabit.
nothrow

1
Bu yüzden, bu kodu bağımsız bir projeye ekledim github.com/AlexChesser/AspnetIdentitySample/commit/… ve AspnetRoles başarıyla oluşturuldu, ancak bazı nedenlerden dolayı sayfalar 'beyaz ekranlara' dönüşüyor (500 hatası olduğunu varsayıyorum, ancak Yığın izleme yok), bu yüklüyken sayfaları oluşturabildiniz mi?
Alex C

tamam - bu tamamlama beyaz ekran hatasını düzeltir github.com/AlexChesser/AspnetIdentitySample/commit/… EnsureRolesCreated içinde onu Görev yerine bir void olarak değiştirdiğime dikkat edin.
Alex C

1
'EnsureRolesCreated'e sahip olmak void döndürmek, rollerin Yapılandırma bitmeden önce oluşturulmadığı anlamına gelebilir
nothrow

6

Yukarıdaki Peters kodunda bir iyileştirme olarak şunu kullanabilirsiniz:

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

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

3

Peter Stulinski ve Dave Gordon'un kod örneklerini EF 6.0 ile kullandığımda uygulamam başlangıçta takılıyordu. Ben değiştim:

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

-e

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

Bu, tohum yönteminde .tls dosyasının başka bir örneğini başlatmak istemediğinizde anlamlıdır ApplicationDBContext. Bu, kurucumda sahip olduğum gerçeğiyle daha Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());da karmaşık olabilirdi.ApplicationDbContext


2

Roller Modeli Görüntüle

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

Denetleyici yöntemi

    [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

Rol eklemek için başka bir çözüm paylaşmak istedim:

<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" />
}

Denetleyici:

    [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

Yeni bir ASP.net Web uygulaması seçtiğinizde ve Kimlik Doğrulama olarak Bireysel Kullanıcı hesaplarını seçtiğinizde oluşturulan varsayılan şablonu kullanıyorsanız ve Rollerle kullanıcılar oluşturmaya çalışıyorsanız, çözüm burada. [HttpPost] kullanılarak çağrılan Hesap Denetleyicisinin Kayıt yönteminde, aşağıdaki satırları ekleyin if condition.

Microsoft.AspNet.Identity.EntityFramework kullanarak;

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

Bu, önce veritabanınızda bir rol oluşturacak ve ardından yeni oluşturulan kullanıcıyı bu role ekleyecektir.


0
    public static void createUserRole(string roleName)
    {
        if (!System.Web.Security.Roles.RoleExists(roleName))
        {
            System.Web.Security.Roles.CreateRole(roleName);
        }
    }

0

Rol oluşturmak için kullandığım yöntem aşağıda verilmiştir, bunların koddaki kullanıcılara atanması da listelenmiştir. aşağıdaki kod, geçişler klasöründeki "configuration.cs" içinde yer almaktadır.

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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.