2017-08-10 182 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

所以,如果用戶有一個取值爲「管理員」,那麼它是管理員索賠?你至少應該檢查這個類型是否也是「角色」。 –

相關問題