Comment puis-je obtenir le ou les rôles de l'utilisateur connecté dans ASP.NET Core MVC? Je souhaite obtenir les détails du rôle dès que l'utilisateur se connecte à l'application, mais en utilisant le code suivant, je ne suis pas en mesure de récupérer les détails du rôle
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
_logger.LogInformation(1, "User logged in.");
bool available = User.IsInRole("Admin");
return RedirectToLocal(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToAction(nameof(SendCode), new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
}
if (result.IsLockedOut)
{
_logger.LogWarning(2, "User account locked out.");
return View("Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return View(model);
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
De plus, j'ai utilisé les méthodes ci-dessous comme
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var userRoles = await _userManager.GetRolesAsync(user);
Pourtant, je ne suis pas en mesure d'obtenir les détails du rôle. Quelqu'un peut-il m'aider à ce sujet?
Vous voudrez peut-être envisager d'essayer de charger l'objet ApplicationUser
réel via la fonction FindByEmail()
ou une autre méthode et de passer cet objet dans la méthode GetRolesAsync()
comme indiqué ci-dessous:
// Resolve the user via their email
var user = await _userManager.FindByEmailAsync(model.Email);
// Get the roles for the user
var roles = await _userManager.GetRolesAsync(user);
Un exemple plus complet pourrait ressembler à ceci:
[HttpPost("Auth/SignIn")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> SignIn(SignInViewModel model, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, true, false);
if (result.Succeeded)
{
// Resolve the user via their email
var user = await _userManager.FindByEmailAsync(model.Email);
// Get the roles for the user
var roles = await _userManager.GetRolesAsync(user);
// Do something with the roles here
}
else
{
// Uh oh....
}
}
// Something is probably wrong, provide the form again....
return View(model);
}
Court mais utile:
[Route("api/[controller]")]
[ApiController]
public class RoleController : ControllerBase
{
private readonly UserManager<User> userManager;
public RoleController(
UserManager<User> userManager
)
{
this.userManager = userManager;
}
// GET api/role
[HttpGet]
[Authorize]
public async Task<IEnumerable<string>> Get()
{
var userId = User.FindFirstValue(ClaimTypes.Name);
var user = await userManager.FindByIdAsync(userId);
var role = await userManager.GetRolesAsync(user);
return role;
}
}
J'espère que ça aide.