2014-04-30 9 views
5

Mit Web-API 2 und Identität 2 versuche ich eine Aktion zum Entfernen eines Benutzers aus Rollen mit Benutzer-ID und Rollennamen zu erstellen. Ich verwende den ApplicationUserManager, der vom nuget identity2-Beispiel bereitgestellt wird.Benutzer können nicht aus einer bestimmten Rolle entfernt werden

Meine Aktion

[HttpPost] 
[Route("RemoveUserFromRole")] 
public async Task<IHttpActionResult> RemoveUserFromRole(UserRolesViewModel model) 
{ 
    if (!ModelState.IsValid) 
     return BadRequest(ModelState); 

    var result = await UserManager.RemoveUserFromRolesAsync(
     model.UserId, model.RoleNames); 

    if (result.Errors.Any()) 
     return InternalServerError(); 

    return Ok(); 
} 

Meine Ansicht Modell:

public class UserRolesViewModel 
{ 
    [Required] 
    public string UserId { get; set; } 

    [Required] 
    public IList<string> RoleNames { get; set; } 
} 

ApplicationUserManager des RemoveUserFromRolesAsync:

public virtual async Task<IdentityResult> RemoveUserFromRolesAsync(
    string userId, IList<string> roles) 
{ 
    var userRoleStore = (IUserRoleStore<ApplicationUser, string>) Store; 

    var user = await FindByIdAsync(userId).ConfigureAwait(false); 
    if (user == null) 
     throw new InvalidOperationException("Invalid user Id"); 

    var userRoles = await userRoleStore.GetRolesAsync(user).ConfigureAwait(false); 
    foreach (var role in roles.Where(userRoles.Contains)) 
     await userRoleStore.RemoveFromRoleAsync(user, role).ConfigureAwait(false); 

    return await UpdateAsync(user).ConfigureAwait(false); 
} 

Mein Problem ist, dass ein Benutzer gegeben, die zu den Rollen 'User' und ' Mod 'kann der Benutzer nicht von' Mod 'entfernt werden. Buchen die folgende json entfernt der Benutzer aus der Rolle ‚Benutzer‘ wie erwartet:

{ 
    "userId": "0d5f97e4-65a0-43ad-b889-0af98a7ff326", 
    "roleNames": [ 
     "User" 
    ] 
} 

Aber die folgenden json gegeben, Benutzer von ‚Mod‘ nicht entfernt wird, sondern stattdessen von ‚User‘ entfernt:

{ 
    "userId": "0d5f97e4-65a0-43ad-b889-0af98a7ff326", 
    "roleNames": [ 
     "Mod" 
    ] 
} 

Debugging zeigt, dass bei Angabe der Rolle 'Mod' die korrekte Benutzer-ID und der korrekte Rollenname an userRoleStore übergeben werden.

Antwort

4

Das war ein Fehler, der 2.0.1

+0

Dank - haben Sie eine Quelle für diese haben passieren? –

+0

https://aspnetidentity.codeplex.com/workitem/2069 –

+0

Ahh - Ich aktualisiert auf 2.0.1 in meinem Hauptprojekt, aber vergaß und blieb bei 2.0 in meinem Test. Danke noch einmal –

0

// hässlich in Version behoben werden sollte, sondern arbeitet

db.Database.ExecuteSqlCommand(@"delete from aspnetuserroles from 
aspnetuserroles ur inner join aspnetroles r on r.id=ur.roleid inner join aspnetusers 
u on u.id=ur.userid where [email protected] and [email protected]", 
    new SqlParameter("@role",RoleName) , 
    new SqlParameter("@user",UserName)); 
Verwandte Themen