繁体   English   中英

管理员声明已添加到IdentityUser中,但usermanager不能通过IsInRoleAsync找到它

[英]Admin claim added to IdentityUser, but the usermanager does not find it with IsInRoleAsync

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

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中查找,但是我不确定是否还有另一种方法可以检查此问题。

IsInRoleAsync在您的情况下失败,因为您传递的是整个对象,而不是UserId。

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

因此,您实际上应该传递Gebruiker对象的UserId字段,而不是对象本身。

MSDN

我已经通过使用GetClaimsAsync解决了该问题:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM