Erstellen von Rollen in Asp.net Identity MVC 5

85

Es gibt nur sehr wenige Dokumentationen zur Verwendung des neuen Asp.net Identity Security Framework.

Ich habe alles zusammengestellt, um zu versuchen, eine neue Rolle zu erstellen und einen Benutzer hinzuzufügen. Ich habe Folgendes versucht: Rolle in ASP.NET-Identität hinzufügen

Das sieht so aus, als hätte es die Informationen aus diesem Blog erhalten: Erstellen einer einfachen Aufgabenanwendung mit asp.net-Identität und Verknüpfen von Benutzern mit Aufgaben

Ich habe den Code einem Datenbankinitialisierer hinzugefügt, der ausgeführt wird, wenn sich das Modell ändert. Es schlägt bei der RoleExistsFunktion mit folgendem Fehler fehl :

System.InvalidOperationException aufgetreten in mscorlib.dll Der Entitätstyp IdentityRole ist nicht Teil des Modells für den aktuellen Kontext.

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

Jede Hilfe wird geschätzt.

colbyJax
quelle

Antworten:

26

Stellen Sie sicher, dass Sie die folgende Unterschrift Ihrer MyContextKlasse haben

public class MyContext : IdentityDbContext<MyUser>

Oder

public class MyContext : IdentityDbContext

Der Code funktioniert bei mir ohne Änderungen !!!

jd4u
quelle
4
Vielen Dank an alle für Ihre Antworten. Alles funktioniert jetzt. Das Überprüfen des Kontexts führte mich in die richtige Richtung. Wenn eine asp.net-Identität erstellt wird, wird ein neuer Kontext (ApplicationDbContext) erstellt, der IdentityDbContext erweitert. In meinem Code habe ich auf meinen ursprünglichen Kontext verwiesen, der IdentityDbContext nicht erweitert hat. Wenn jemand anderes dieses Problem hat, überprüfen Sie Ihre Kontexte und überprüfen Sie Ihr APP_DATA-Verzeichnis, um sicherzustellen, dass Sie nicht versehentlich zwei Datenbanken erstellen.
ColbyJax
74

Auf geht's:

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

    }
Piotr Stulinski
quelle
2
Dies hat mir geholfen, zumal ich keine Migrationen verwendet habe. Ich verwende DropCreateDatabaseAlways.
J86
Mein Problem war, dass ich den falschen Kontext verwendete. Ich hatte zwei Verbindungszeichenfolgen erstellt, eine aufgerufene IdentityDbContextund eine andere, die ich in einem benutzerdefinierten Kontext verwendete. Als ich Ihren Vorschlag verwendete AppilcationDbContext(), funktionierte dies.
Megamaiku
var roleManager = neuer RoleManager <IdentityRole> (neuer RoleStore <IdentityRole> (db));
Nour Lababidi
25

In diesem vollständigen Artikel wird beschrieben, wie Sie mithilfe von ASP.NET Identity Rollen erstellen, Rollen ändern, Rollen löschen und Rollen verwalten. Dies beinhaltet auch Benutzeroberfläche, Controller-Methoden usw.

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

Hoffe das hilft

Vielen Dank

Sheo Narayan
quelle
1
Ihr Blog ist nett, aber veraltet, können Sie den Account Controller aktualisieren
Aggie
Es ist bereits für ASP.NET MVC 5 (Welches Update suchen Sie nach Aggie?). Sie können den Quellcode über den im Artikel angegebenen GitHub-Link herunterladen.
Sheo Narayan
1
Einige dieser Funktionen scheinen spätestens ab 2.2.0 veraltet zu sein. 1) Kann ich den gleichen Code in der aktuellen Version verwenden? 2) Wie kann ich den Primärschlüssel von Guid in E-Mail ändern? 3) Empfehlungen zur Integration von Recpatcha in Identity sind willkommen. J.mp/1nohaHe
aggie
15

In habe ASP.NET 5 rc1-finalich folgendes gemacht:

Erstellt ApplicationRoleManager(auf ähnliche Weise wie ApplicationUserdurch Vorlage erstellt)

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

Um ConfigureServicesin Startup.cs, habe ich es als Rolemanager

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

Rufen Sie zum Erstellen neuer Rollen wie Configurefolgt auf:

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

Jetzt können die Regeln dem Benutzer zugewiesen werden

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

Oder in AuthorizeAttribut verwendet

[Authorize(Roles = "Developer")]
public class DeveloperController : Controller
{
}
nothrow
quelle
services.AddIdentity<UserAuth, IdentityRole>().AddRoleManager<ApplicationRoleManager>() Ich konnte es nicht servicesdirekt hinzufügen .
Alex C
2
@ AlexC, Entschuldigung, mein schlechtes. Ich habe versucht, es so einfach wie möglich zu halten und die AddIdentity entfernt. Fest.
Nothrow
1
Also habe ich diesen Code zu einem eigenständigen Projekt hinzugefügt: github.com/AlexChesser/AspnetIdentitySample/commit/… und die AspnetRoles werden erfolgreich erstellt, aber aus irgendeinem Grund werden die Seiten zu "Whitescreens" (ich gehe von einem 500-Fehler aus, aber no stacktrace) Konnten Sie Seiten mit dieser Installation rendern?
Alex C
ok - das commit behebt den Fehler Weißbild github.com/AlexChesser/AspnetIdentitySample/commit/... bemerkt , dass innerhalb EnsureRolesCreated Ich habe es auf eine Leere statt Aufgabe umgeschaltet.
Alex C
1
Wenn 'EnsureRolesCreated' nichtig ist, kann dies bedeuten, dass die Rollen nicht erstellt werden, bevor die Konfiguration abgeschlossen ist
nothrow
6

Als Verbesserung des obigen Peters-Codes können Sie Folgendes verwenden:

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

   if (!roleManager.RoleExists("Member"))
            roleManager.Create(new IdentityRole("Member"));
Dave Gordon
quelle
3

Meine Anwendung hing beim Start, als ich die Codebeispiele von Peter Stulinski & Dave Gordon mit EF 6.0 verwendete. Ich habe mich verändert:

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

zu

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

Dies ist sinnvoll, wenn Sie in der Seed-Methode keine weitere Instanz von instanziieren möchten ApplicationDBContext. Dies könnte durch die Tatsache verstärkt worden sein, dass ich Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());im Konstruktor von hatteApplicationDbContext

Däne W.
quelle
2

Rollen Modell anzeigen

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

Controller-Methode

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

Ich wollte eine andere Lösung zum Hinzufügen von Rollen teilen:

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

Regler:

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

Wenn Sie die Standardvorlage verwenden, die erstellt wird, wenn Sie eine neue ASP.net-Webanwendung auswählen und einzelne Benutzerkonten als Authentifizierung auswählen und versuchen, Benutzer mit Rollen zu erstellen, finden Sie hier die Lösung. Fügen Sie in der Register-Methode des Account Controllers, die mit [HttpPost] aufgerufen wird, die folgenden Zeilen hinzu if condition.

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

Dadurch wird zunächst eine Rolle in Ihrer Datenbank erstellt und anschließend der neu erstellte Benutzer zu dieser Rolle hinzugefügt.

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

Die Methode, die ich zum Erstellen von Rollen verwende, ist unten aufgeführt. Außerdem wird sie den Benutzern im Code zugewiesen. Der folgende Code befindet sich in "configuration.cs" im Migrationsordner.

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();
Kevin
quelle