Pregunta Crear roles en Asp.net Identity MVC 5


Hay muy poca documentación sobre el uso del nuevo Asp.net Identity Security Framework.

He reconstruido todo lo que pude para intentar crear un nuevo Rol y agregarle un Usuario. Intenté lo siguiente: Agregar rol en Identidad ASP.NET

que parece que puede haber obtenido la información de este blog: crear una aplicación simple para hacer con identidad asp.net y asociar usuarios con "to-does"

He agregado el código a un inicializador de base de datos que se ejecuta cada vez que cambia el modelo. Falla en el RoleExists funcionar con el siguiente error:

System.InvalidOperationException producido en mscorlib.dll   El tipo de entidad IdentityRole no es parte del modelo para el contexto actual.

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

Cualquier ayuda es apreciada.


75
2017-10-31 02:08


origen


Respuestas:


Verifique que tenga la siguiente firma de su MyContext clase

public class MyContext : IdentityDbContext<MyUser>

O

public class MyContext : IdentityDbContext

¡El código funciona para mí, sin ninguna modificación!


20
2017-10-31 06:25



Aquí vamos:

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

    }

66
2017-10-31 10:47



Aquí está el artículo completo que describe cómo crear roles, modificar roles, eliminar roles y administrar roles usando ASP.NET Identity. Esto también contiene interfaz de usuario, métodos de controlador, etc.

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

Espero que esto ayude

Gracias


22
2018-06-26 01:38



En ASP.NET 5 rc1-final, Lo hice siguiente:

Creado ApplicationRoleManager (de manera similar a como existe ApplicationUser creado por la plantilla)

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

A ConfigureServices en Startup.cs, Lo agregué como RoleManager

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

Para crear nuevas funciones, llame desde Configure siguiendo:

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

Ahora, las reglas se pueden asignar al usuario

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

O usado en Authorize atributo

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

14
2017-12-20 14:11



Como una mejora en el código de Peters anterior puedes usar esto:

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

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

7
2018-06-09 17:59



Mi aplicación estaba pendiente de inicio cuando utilicé las muestras de código de Peter Stulinski y Dave Gordon con EF 6.0. Cambié:

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

a

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

Lo cual tiene sentido cuando en el método de semilla no quieres instanciar otra instancia del ApplicationDBContext. Esto podría haberse complicado por el hecho de que tuve Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer()); en el constructor de ApplicationDbContext


3
2018-03-07 04:41



Modelo de vista de roles

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

Método del controlador

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

2
2017-08-27 14:24