2017-08-10 3 views
0

管理者が電子メールで新しい管理者を追加できるコードがあります。ユーザーが私たちのシステムにいるかどうかを確認します。そうであれば、がすでにの管理者であることを確認します。奇妙なことは、既に「admin」という主張を持っているユーザーは引き続き管理者として追加され、事実上、データベース内で別の同じ主張を与えることです。いくつかのデバッグ後、私はIsInRoleAsyncが常にfalseを返すことを発見しました。これの原因は何か?管理者のクレームはIdentityUserに追加されましたが、Usermanagerは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はあなたのケースで失敗しています。

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

だから、あなたが実際にではなく、オブジェクト自体よりも、GebruikerオブジェクトのユーザーIDフィールドを渡す必要があります。

MSDN

-1

私はGetClaimsAsyncを使用することによって、問題を解決しました:あなたはむしろユーザーIDよりも、オブジェクト全体を渡しているので

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

したがって、ユーザーに値「admin」のクレームがある場合は、管理者ですか?少なくとも、そのタイプが「役割」であるかどうかを少なくともチェックする必要があります。 –

関連する問題