userManager.AddToRoleAsync() - Fehler: Rolle nicht vorhanden
Ich bin erstellen einer Benutzer-Registrierung-system verwenden .NET Core, Identität, Kern, und der MVC-Kern. Ich bin in der Lage, erstellen Sie Benutzer und Rollen erstellen, in der Datenbank.
Hier ist das Formular auf der Ansicht, dass lässt mich wählen Sie einen Benutzer, und wählen Sie eine Rolle hinzufügen:
@using (Html.BeginForm("AddRoleToUser", "Roles"))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<p>
Username : @Html.DropDownList("UserName", (IEnumerable<SelectListItem>)ViewBag.Users, "Select ...")
Role Name: @Html.DropDownList("RoleName", (IEnumerable<SelectListItem>)ViewBag.Roles, "Select ...")
</p>
<input type="submit" value="Save" />
}
Diese drop-down-Listen sind gefüllt mit Benutzer und Rollen, die bereits in der Datenbank vorhanden. Sie ermöglicht es mir, wählen Sie User
s , und die Namen eine Rolle, die ich bereits erstellt. Ich habe zum Beispiel eine Rolle mit dem Namen "admin", mit diesem Formular können Sie mir wählen Sie die Zeichenfolge "admin".
Hier ist die Aktion, die Griffe hinzufügen einer Rolle zu einem Benutzer:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> AddRoleToUser(string UserName, string RoleName)
{
try
{
ApplicationUser user = _db.Users.Where(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
await _userManager.AddToRoleAsync(user, RoleName);
PrepopulateDropDownMenus();
ViewBag.ResultMessage = "Role created successfully!";
return View("Manage", "Roles");
}
catch (Exception ex)
{
Console.WriteLine(ex);
return View("Manage");
}
}
Die Aktion nicht hinzufügen der Rolle für den Benutzer und die Ausnahme heißt "Rolle "ADMIN" existiert nicht." ohne innere Ausnahme. Ich habe versucht, drehen den RoleName
im action-Parameter, um alle Kappen, aber noch nicht die Rolle. Ich habe auch versucht, mit der Rolle, die ID statt des namens, das war auch erfolglos.
Genau diesem code funktioniert, wenn ich baute dieses app mithilfe von Identity 3.0 mit MVC-6. Wie es scheint, hat sich etwas verändert in Bewegung über, um die Identität Core.
Irgendwelche Gedanken?
Bearbeiten
Hier ist der code, den ich verwende zum füllen der Dropdown-Listen in RolesController
über den Viewbag:
private void PrepopulateDropDownMenus()
{
var rolesList = _db.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList();
var usersList = _db.Users.OrderBy(u => u.UserName).ToList().Select(uu => new SelectListItem { Value = uu.UserName.ToString(), Text = uu.UserName }).ToList();
ViewBag.Roles = rolesList;
ViewBag.Users = usersList;
}
Hier ist, wie ich hinzufügen Identität in Start.cs in der ConfigureServices
Methode:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddEntityFramework()
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"]));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
}
Hier ist die route in RolesController.cs ich verwenden, um erstellen Sie eine neue Rolle in der Datenbank:
[HttpPost]
public IActionResult Create(string rolename)
{
_db.Roles.Add(new IdentityRole()
{
Name = rolename
});
_db.SaveChanges();
ViewBag.ResultMessage = "Role created successfully!";
return RedirectToAction("Index");
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann ich keine Kommentare posten noch zu Fragen, Sie, so, ist Ihre Fehler sagen Benutzer admin nicht vorhanden ist, oder Rolle nicht vorhanden ist? Ich habe versucht, zu duplizieren code auf mein Ende, und wenn der Benutzer nicht existiert, erhalten Sie einen "Benutzer kann nicht null sein" Fehler. Allerdings, wenn die Rolle nicht vorhanden ist, erhalten Sie eine "Rolle [Rolle] ist nicht vorhanden" Fehler.
Ich gehe davon aus, dass Sie bereits über die Rolle Hinzugefügt, in der Datenbank? Hier ist etwas code, den ich in meinem seed-Methode, die im wesentlichen das tut, was Sie möchten, minus-mit der Aussicht, es zu tun:
BEARBEITEN
Die Weise, die Sie hinzufügen von Rollen rechts verlässt nun den NormalizedName Feld in der Rolle Tabelle null ist, die ich glaube, wird vom framework zum hinzufügen von Rollen zu Benutzern. Versuchen Sie einen der folgenden Schritte zum hinzufügen einer Rolle auf die Datenbank statt, was Sie gerade tun:
Oder kann dies auch funktionieren (noch nicht getestet, aber):
Create
Aktion in dem controller mit derAdd
- Methode für die Datenbank."Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0"
im Projekt.json. Ich habe meineConfigureServices
Methode in den edit oben. Ich Schätze Ihre Anregungen!UPDATE [Roles] SET NormalizedName = UPPER(Name)
Indem es direkt auf der Datenbank ist eine schlechte Idee und verstößt gegen jedes Konzept der Kapselung, und NormalizedName ist nicht etwas, was Sie sein sollte-computing selbst.
Lesen Sie diese Antwort
Dieser code ersetzen:
mit folgenden: