web-dev-qa-db-de.com

Erstellen von Rollen in Asp.net Identity MVC 5

Es gibt sehr wenig Dokumentation zur Verwendung des neuen Asp.net Identity Security Framework.

Ich habe zusammengesetzt, was ich tun könnte, um eine neue Rolle zu erstellen und einen Benutzer hinzuzufügen. Ich habe Folgendes versucht: Rolle in ASP.NET-Identität hinzufügen

anscheinend hat es die Informationen aus diesem Blog erhalten: Erstellen einer einfachen Aufgabenanwendung mit asp.net-Identität und Zuordnen von Benutzern zu Aufgaben

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

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

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.

81
colbyJax

Stellen Sie sicher, dass Sie die folgende Signatur Ihrer Klasse MyContext haben

public class MyContext : IdentityDbContext<MyUser>

Oder

public class MyContext : IdentityDbContext

Der Code funktioniert bei mir ohne Änderungen !!!

24
jd4u

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

    }
72
Piotr Stulinski

In diesem vollständigen Artikel wird beschrieben, wie Sie mithilfe von ASP.NET Identity Rollen erstellen, ändern, löschen und verwalten. Dies beinhaltet auch die 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

25
Sheo Narayan

Im ASP.NET 5 rc1-final, Ich habe folgendes gemacht:

Erstellt ApplicationRoleManager (ähnlich wie ApplicationUser durch Vorlage erstellt wurde)

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

An ConfigureServices in Startup.cs, Ich habe es als RoleManager hinzugefügt

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

Rufen Sie zum Erstellen neuer Rollen von Configure aus Folgendes 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 verwendet im Authorize Attribut

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

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"));
6
Dave Gordon

Meine Anwendung hing beim Start, als ich Peter Stulinski & Dave Gordons Codebeispiele 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**));

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

3
Dane W

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

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

Wenn Sie die Standardvorlage verwenden, die erstellt wird, wenn Sie eine neue ASP.net-Webanwendung auswählen und Einzelbenutzerkonten 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 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");
}

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

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

die Methode, die ich zum Erstellen von Rollen verwende, ist unten aufgeführt. Das Zuweisen von Rollen zu Benutzern im Code wird ebenfalls aufgeführt. 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();
0
Kevin