2017-08-10 166 views
0

我有一段代码可让管理员通过电子邮件添加新的管理员。我检查用户是否在我们的系统中。如果是,我检查它是否已经一个管理员。奇怪的是,已经拥有“管理员”声明的用户仍将作为管理员添加,从而有效地为他们提供了另一个与数据库中相同的声明。经过一些调试后,我发现IsInRoleAsync将始终返回false。这可能是什么原因?管理员声明已添加到IdentityUser,但用户管理员找不到IsInRoleAsync

public async Task<IActionResult> VoegAdminToe(VoegAdminToeViewModel vam) 
{ 
    if (ModelState.IsValid) 
    { 
     Gebruiker g = _gebruikerRepository.GetByEmail(vam.Email); 
     if (g != null) 
     { 
      bool isAdmin = await _userManager.IsInRoleAsync(g, "admin"); 
      if (!isAdmin) 
      { 
       await _userManager.AddClaimAsync(g, new Claim(ClaimTypes.Role, "admin")); 
       return RedirectToAction(nameof(Index)); 
      } 
      ModelState.AddModelError("GebruikerAlAdmin", "Deze gebruiker is al Admin"); 

      return View(vam); 
     } 
     ModelState.AddModelError("GebruikerNull","Deze gebruiker zit niet in het systeem"); 
     return View(vam); 
    } 
    else 
    { 
     return View(vam); 

    } 
} 

我的猜测是功能IsInRoleAsync不会去寻找在表AspNetUserClaims,但我不能肯定是否有检查此的另一种方法。

回答

1

IsInRoleAsync未能在你的情况,因为你正在传递一个完整的对象,而不是用户ID。

bool isAdmin = await _userManager.IsInRoleAsync(g, "admin"); 

所以,你实际上应传递Gebruiker对象的用户ID字段,而不是对象本身。

MSDN

-1

我用GetClaimsAsync解决了这个问题:

IList<Claim> claimsUser = await _userManager.GetClaimsAsync(g); 
bool isAdmin = claimsUser.FirstOrDefault(c => c.Value == "admin") != null; 
+0

所以,如果用户有一个取值为“管理员”,那么它是管理员索赔?你至少应该检查这个类型是否也是“角色”。 –