Creazione di ruoli in Asp.net Identity MVC 5


85

C'è pochissima documentazione sull'utilizzo del nuovo Asp.net Identity Security Framework.

Ho messo insieme quello che potevo per provare a creare un nuovo ruolo e aggiungervi un utente. Ho provato quanto segue: Aggiungi ruolo in ASP.NET Identity

che sembra aver ottenuto le informazioni da questo blog: creazione di una semplice applicazione da fare con l'identità di asp.net e associazione degli utenti con le cose da fare

Ho aggiunto il codice a un inizializzatore di database che viene eseguito ogni volta che il modello cambia. Non riesce sulla RoleExistsfunzione con il seguente errore:

System.InvalidOperationException si è verificato in mscorlib.dll Il tipo di entità IdentityRole non fa parte del modello per il contesto corrente.

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

Qualsiasi aiuto è apprezzato.

Risposte:


26

Verifica di avere la seguente firma della tua MyContextclasse

public class MyContext : IdentityDbContext<MyUser>

O

public class MyContext : IdentityDbContext

Il codice funziona per me, senza alcuna modifica !!!


4
Grazie a tutti per le vostre risposte. Adesso funziona tutto. Il controllo del contesto mi ha portato nella giusta direzione. Quando viene creata l'identità asp.net, crea un nuovo contesto (ApplicationDbContext) che estende IdentityDbContext. Nel mio codice, facevo riferimento al mio contesto originale che non estendeva IdentityDbContext. Se qualcun altro ha questo problema, controlla i tuoi contesti e ricontrolla la tua directory APP_DATA per assicurarti di non creare accidentalmente due database.
colbyJax

74

Eccoci qui:

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
Questo mi ha aiutato, soprattutto perché non stavo usando le migrazioni. Sto usando DropCreateDatabaseAlways.
J86

Il mio problema era che stavo usando il contesto sbagliato. Avevo creato due stringhe di connessione, una chiamata IdentityDbContexte un'altra che stavo usando un contesto personalizzato, quindi quando ho usato il tuo suggerimento AppilcationDbContext(), ha funzionato.
megamaiku

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

25

Di seguito è riportato l'articolo completo che descrive come creare ruoli, modificare ruoli, eliminare ruoli e gestire ruoli utilizzando ASP.NET Identity. Questo contiene anche l'interfaccia utente, i metodi del controller ecc.

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

Spero che questo aiuti

Grazie


1
Il tuo blog è carino, ma non aggiornato, puoi aggiornare il controller dell'account
aggie

È già per ASP.NET MVC 5 (quale aggiornamento stai cercando aggie?). È possibile scaricare il codice sorgente dal collegamento GitHub specificato nell'articolo.
Sheo Narayan

1
Alcune di queste funzioni sembrano deprecate dalla 2.2.0 nell'ultima versione. 1) posso usare lo stesso codice nella versione attuale 2) come posso cambiare la chiave primaria da Guid a email 3) eventuali consigli su come integrare recpatcha con Identity sarebbero apprezzati j.mp/1nohaHe
aggie

15

In ASP.NET 5 rc1-final, ho seguito:

Creato ApplicationRoleManager(in modo simile a quello ApplicationUsercreato dal modello)

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

Per ConfigureServicesin Startup.cs, ho aggiunto come RoleManager

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

Per creare nuovi ruoli, chiama dal Configureseguente:

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

Ora, le regole possono essere assegnate all'utente

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

O usato Authorizenell'attributo

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

services.AddIdentity<UserAuth, IdentityRole>().AddRoleManager<ApplicationRoleManager>() Non sono riuscito ad aggiungerlo servicesdirettamente a.
Alex C

2
@ AlexC, scusa, colpa mia. Ho cercato di mantenerlo il più semplice possibile e ho rimosso AddIdentity. Fisso.
nothrow

1
Quindi, ho aggiunto quel codice a un progetto autonomo github.com/AlexChesser/AspnetIdentitySample/commit/… e gli AspnetRoles vengono creati con successo, ma per qualche motivo, le pagine diventano 'whitescreens' (presumo un errore 500, ma no stacktrace) sei stato in grado di visualizzare le pagine con questo installato?
Alex C

ok - questo commit risolve l'errore whitescreen github.com/AlexChesser/AspnetIdentitySample/commit/… nota che all'interno di GuaranteRolesCreated l'ho trasformato in void invece di Task.
Alex C

1
la restituzione di "GuaranteRolesCreated" può significare che i ruoli non vengono creati prima del termine della configurazione
nothrow

6

Come miglioramento del codice Peters sopra puoi usare questo:

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

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

3

La mia applicazione era in sospeso all'avvio quando ho utilizzato gli esempi di codice di Peter Stulinski e Dave Gordon con EF 6.0. Ho cambiato:

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

per

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

Il che ha senso quando nel metodo seed non si desidera creare un'istanza di un'altra istanza di ApplicationDBContext. Questo potrebbe essere stato aggravato dal fatto che avevo Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());nel costruttore diApplicationDbContext


2

Ruoli Visualizza modello

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

Metodo del controller

    [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

Volevo condividere un'altra soluzione per l'aggiunta di ruoli:

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

Controller:

    [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

Se si utilizza il modello predefinito creato quando si seleziona una nuova applicazione Web ASP.net e si selezionano account utente individuali come autenticazione e si tenta di creare utenti con ruoli, ecco la soluzione. Nel metodo Register del controller dell'account, chiamato utilizzando [HttpPost], aggiungere le seguenti righe in if condition.

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

Questo creerà prima un ruolo nel database e quindi aggiungerà l'utente appena creato a questo ruolo.


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

0

il metodo che utilizzo per la creazione dei ruoli è riportato di seguito, inoltre è elencato l'assegnazione agli utenti nel codice. il codice seguente si trova in "configuration.cs" nella cartella migrations.

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();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.