2017-03-02 34 views
0

我已經創建了一個用戶並附加了一個具有多個聲明的角色。問題是我沒有看到直接訪問的方式使用實體框架核心和身份集成來檢索它們。這裏是我想要做的理想:如何獲取角色聲明?

return _context.Users 
    .Include(u => u.Roles) 
    .ThenInclude(r => r.Role) 
    .ThenInclude(r => r.Claims) 

但是沒有Role屬性,只是RoleId。所以我不能包括角色聲明。當然,我會做一個單獨的查詢來獲得索賠,甚至使用RoleManager:

var user = _context.Users.Single(x => x.Id == ...); 
var role = _roleManager.Roles.Single(x => x.Id == user.Roles.ElementAt(0).RoleId); 
var claims = _roleManager.GetClaimsAsync(role).Result; 

但它看起來效率低下,甚至醜陋。應該有一種方法來進行單個查詢。

我最後的希望是Controller.User屬性(ClaimsIdentity)。我希望能夠巧妙地彙總所有角色的主張。但好像它不...

+0

Controller.User應該工作。這就是我用來檢查當前登錄的會話。您是否正在檢查已登錄的會話,或者您是否想要查找其他用戶? –

+0

我試圖讓它登錄用戶。我也認爲它應該有效,但似乎並非如此。看起來像它只得到User.Claims。 – SiberianGuy

+0

@Mike_G,它似乎是我使用IdentityServer的原因,並且默認情況下它不負責角色聲明。如果我使用其他身份驗證方法,可能會默認檢索角色聲明。 – SiberianGuy

回答

1

您可以使用類似於SQL的查詢表達式,並從這樣的用戶的所有角色獲得的所有索賠:

var claims = from ur in _context.UserRoles 
      where ur.UserId == "user_id" 
      join r in _context.Roles on ur.RoleId equals r.Id 
      join rc in _context.RoleClaims on r.Id equals rc.RoleId 
      select rc; 
0
  1. 確保您加入角色和要求正確。以下是我如何創建用戶並添加聲明和角色的示例。

    private async Task<IdentityResult> CreateNewUser(ApplicationUser user, string password = null){ 
    
        //_roleManger is of type RoleManager<IdentityRole> 
        // _userManger is of type UserManager<ApplicationUser> 
        //and both are injected in to the controller. 
    
        if (!await _roleManger.RoleExistsAsync("SomeRole")){ 
         await _roleManger.CreateAsync(new IdentityRole("SomeRole")); 
        } 
    
        var result = password != null ? await _userManager.CreateAsync(user, password) : await _userManager.CreateAsync(user); 
    
        if(result.Succeeded) { 
    
         await _userManager.AddToRoleAsync(user, "SomeRole"); 
         await _userManager.AddClaimAsync(user, new Claim(ClaimTypes.Name, user.Email)); 
    
        } 
    
        return result; 
    } 
    
  2. 然後你可以使用_userManager得到索賠。 This is how我得到當前用戶使用_userManager。然後,你可以調用像這樣:

    var claims = await _userManager.GetClaimsAsync(user); 
    
+0

這會向用戶添加索賠,而不是角色。 – LHolleman

+0

@LHolleman你錯過了整個「_userManager.AddToRoleAsync」和「CreateRole」行嗎?你有沒有讀過答案? –