2014-04-30 1 views
5

Utilizzando web-api 2 e identità 2, sto cercando di creare un'azione per rimuovere un utente dai ruoli utilizzando l'ID utente ei nomi dei ruoli. Sto usando ApplicationUserManager fornito dall'esempio di identità2 di nuget.Impossibile rimuovere utenti da un ruolo specifico

mia azione

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

mio punto di vista il modello:

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

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

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

Il mio problema è che, dato un utente appartenente ai ruoli 'utente' e ' Mod ', l'utente non può essere rimosso da' Mod '. Distacco il seguente JSON rimuove l'utente dal ruolo 'utente' come previsto:

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

Ma data la seguente JSON, l'utente non viene rimosso dal 'Mod', ma è invece rimosso dal 'utente':

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

Il debug mostra che quando viene assegnato il ruolo 'Mod', l'ID utente corretto e il nome del ruolo vengono passati in userRoleStore.

risposta

4

Questo è stato un errore che dovrebbe essere risolto nella versione 2.0.1

+0

Grazie - Ti capita di avere una fonte per questo? –

+0

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

+0

Ahh - Ho aggiornato alla 2.0.1 nel mio progetto principale ma ho dimenticato e sono rimasto a 2.0 nel mio test. Grazie ancora –

0

// brutto ma funziona

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