2014-02-12 8 views
18

Ich habe ein .NET-Web-API-Projekt, das Benutzer die einzelnen Konten. Ich kann Benutzer mit der Standardvorlage AccountController gut registrieren. Ich möchte jetzt jedoch Rollen einrichten und Benutzer zu Rollen je nach Benutzertyp hinzufügen.Erstellen von Rollen und Hinzufügen von Benutzern zu Rollen in ASP.NET MVC-Web-API

Im DB sind keine Rollen automatisch eingerichtet. Wie richte ich die Rollen ein und wie füge ich Benutzer zu den Rollen hinzu?

Die einzige Information, die ich dazu finden kann, basiert auf der alten ASP.NET-Mitgliedschaft, so dass es auf die Tatsache fehlschlägt, dass die gespeicherten Prozeduren nicht dafür eingerichtet sind.

Ich habe Foren und Tutorials auf MSDN durchforstet und finde kein Beispiel für Web API.

Antwort

21

Sie können Rollen fügen Sie den Rolemanager mit ...

using (var context = new ApplicationDbContext()) 
{ 
    var roleStore = new RoleStore<IdentityRole>(context); 
    var roleManager = new RoleManager<IdentityRole>(roleStore); 

    await roleManager.CreateAsync(new IdentityRole { Name = "Administrator" }); 

    var userStore = new UserStore<ApplicationUser>(context); 
    var userManager = new UserManager<ApplicationUser>(userStore); 

    var user = new ApplicationUser { UserName = "admin" }; 
    await userManager.CreateAsync(user); 
    await userManager.AddToRoleAsync(user.Id, "Administrator"); 
} 

Sie haben Recht, dass Dokumentation jetzt ein wenig Licht. Aber ich finde, dass wenn man mit dem RoleManager und dem UserManager ein wenig gearbeitet hat, die APIs ziemlich auffindbar sind (aber vielleicht nicht immer intuitiv und manchmal müssen sie Abfragen direkt gegen den Speicher oder sogar den Datenbankkontext ausführen).

+0

Perfect. Danke für die Hilfe! –

+0

Wo muss ich diesen Code oben setzen? Danke @BenDrury – andrefadila

+0

@andrefadila Dieser Code muss überall in Ihrem Code gehen, um eine neue Rolle zu erstellen. Normalerweise würden diese während der Entwicklung, aber möglicherweise in Ihrem Admin-Code eingerichtet werden. Verwenden Sie zum Hinzufügen von Benutzern zu Rollen den Code, wenn Sie einen neuen Benutzer erstellen. –

6

Ich brauchte eine Weile um herauszufinden, aber ich habe es endlich verstanden. Anthony bitte entschuldige mich, aber ich werde viel von deinem Code veröffentlichen, damit dumme Entwickler wie ich es verstehen können.

In der neuesten WebAPI2 (Visual Studio 2013 Update 2) die Registrierungsverfahren wie so aussehen:

// POST api/Account/Register 
[AllowAnonymous] 
[Route("Register")] 
public async Task<IHttpActionResult> Register(RegisterBindingModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 

    var user = new ApplicationUser() { UserName = model.Email, Email = model.Email }; 

    IdentityResult result = await UserManager.CreateAsync(user, model.Password); 


    if (!result.Succeeded) 
    { 
     return GetErrorResult(result); 
    } 

    return Ok(); 
} 

Was möchten Sie tun, ist es ersetzen mit diesem:

// POST api/Account/Register 
[AllowAnonymous] 
[Route("Register")] 
public async Task<IHttpActionResult> Register(RegisterBindingModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 


    IdentityResult result; 
    using (var context = new ApplicationDbContext()) 
    { 
     var roleStore = new RoleStore<IdentityRole>(context); 
     var roleManager = new RoleManager<IdentityRole>(roleStore); 

     await roleManager.CreateAsync(new IdentityRole() { Name = "Admin" }); 

     var userStore = new UserStore<ApplicationUser>(context); 
     var userManager = new UserManager<ApplicationUser>(userStore); 

     var user = new ApplicationUser() { UserName = model.Email, Email = model.Email }; 

     result = await UserManager.CreateAsync(user, model.Password); 
     await userManager.AddToRoleAsync(user.Id, "Admin"); 

    } 

    if (!result.Succeeded) 
    { 
     return GetErrorResult(result); 
    } 

    return Ok(); 
} 

Nun, wenn Sie sollten es richtig funktionieren, aber Sie können auf ein weiteres Problem stoßen. Nachdem ich das getan hatte, beschwerte sich meine Antwort über die DB.

The model backing the <Database> context has changed since the database was created 

Um diesen Fehler zu beheben, musste ich in die Package Manager-Konsole gehen und Migrationen aktivieren.

Enable-Migrations –EnableAutomaticMigrations 

Dann:

Add Migration 

Endlich:

Update-Database 

Ein guter Beitrag zur Aktivierung von hier Migrationen: http://msdn.microsoft.com/en-us/data/jj554735.aspx

+0

Das Instanziieren eines Datenbankkontexts mitten in einer Controller-Methode ist nicht wirklich eine gute Übung. Sehen Sie sich das [dependency inversion] (https://en.wikipedia.org/wiki/Dependency_inversion_principle) Prinzip an. – arnaudoff

Verwandte Themen