2016-06-29 10 views
0

Ich versuche derzeit, die angegebene Benutzerliste von Rollen zu bekommen und habe einige Probleme bei der Anpassung in den Kontext, in dem wir es verwenden. Ich konnte eine Liste von alle verfügbaren Rollen mit dieser API früheren Funktion,Holen Sie sich Benutzerrollen mit ASP.net Identität und Web-API

[HttpGet] 
[Route("GetRoles")] 
public async Task<ApiResponse<List<RoleViewModel>>> GetRoles() 
{ 
    try 
    { 
     //Get Roles 
     var roles = await (from r in _db.AspNetRoles 
        select new RoleViewModel { Id = r.Id, Name = r.Name}).ToListAsync(); 
     return new ApiResponse<List<RoleViewModel>>{ Success = true, Result = roles }; 

    } 
    catch(Exception ex) 
    { 
     return new ApiResponse<List<RoleViewModel>> { Success = false, Message = ex.Message }; 
    } 

} 

Aber kann nicht scheinen, um herauszufinden, was ich in diesen einen werfen müssen, um eine Liste der Rollen für den Benutzer zu erhalten. Wir gingen mit Entity Frameworks Code First aus dem Ansatz der bestehenden Datenbank und ziehen von diesen Tabellen. Seltsamerweise gibt es keine AspNetUserRoles-Tabelle, da ich denke, dass es sich nur um die beiden Tabellen AspNetUsers und AspNetRoles handelt. Wie auch immer, hier ist die Funktion in Frage,

[HttpGet] 
[Route("GetUserRoles")] 
public async Task<ApiResponse<List<RoleViewModel>>> GetUserRoles(string userName) 
{ 
    try 
    { 
     var userRoles = await (_db.AspNetUsers.FirstOrDefault(u => u.UserName == userName).AspNetRoles).ToListAsync(); 
    } 
    catch (Exception ex) 
    { 
     return new ApiResponse<List<RoleViewModel>> { Success = false, Message = ex.Message }; 
    } 
} 

Der aktuelle Fehler, den ich bekommen habe ist, dass AspNetRole enthält keine Definition für ToListAsync(). Ich denke, das asynchrone Zeug wirft mich ein wenig. Und schließlich ist hier der RoleViewModel als Referenz,

public class RoleViewModel 
{ 
    public string Id { get; set; } 

    [Required] 
    [StringLength(256)] 
    public string Name { get; set; } 
} 

und die ApiResponse Klasse,

public class ApiResponse<TResult> 
{ 
    public bool Success { get; set; } 
    public string Message { get; set; } 
    public TResult Result { get; set; } 
} 

Ich mag es fühlen sollte eine einfache Lösung sein, aber ich kann einfach nicht ganz begreifen, was es ist.

+0

Haben Sie "using System.Data.Entity"? – tmg

+0

Ja, das schien eine Menge von Benutzern Probleme, die ich bemerkt habe. Ich habe es gerade ausgearbeitet und meinen Code unten gepostet, danke! – tokyo0709

Antwort

1

Nur die Antwort auf mein Problem gefunden. Die Hauptsache, die mir fehlte, war die Verwendung des Benutzermanagers, der die Dinge so viel einfacher machte. Dann musste ich einfach Dinge in die Funktionen einfügen, die ich bereits definiert hatte. Hier ist der Code.

[HttpGet] 
[Route("GetUserRoles")] 
public async Task<ApiResponse<List<RoleViewModel>>> GetUserRoles(string userName) 
{ 
    try 
    { 
     // Get the user in question 
     var aspUser = (from u in _db.AspNetUsers 
         where u.UserName == userName 
         select u).FirstOrDefaultAsync(); 

     // Check if the user was found 
     if (aspUser == null) 
     { 
      throw new Exception("User was not found"); 
     } 

     // Get the roles associated with that user 
     var userRoles = await UserManager.GetRolesAsync(aspUser.Result.Id.ToString()); 

     // Setup a RoleViewModel list of roles and iterate through userRoles adding them to the list 
     List<RoleViewModel> roleList = new List<RoleViewModel>(); 
     foreach (var u in userRoles) 
     { 
      var item = new RoleViewModel { Name = u }; 
      roleList.Add(item); 
     } 

     return new ApiResponse<List<RoleViewModel>> { Success = true, Result = roleList }; 
    } 
    catch (Exception ex) 
    { 
     return new ApiResponse<List<RoleViewModel>> { Success = false, Message = ex.Message }; 
    } 
} 
Verwandte Themen