Как сделать разные логины по ролям ASP.NET Core 2.2 - PullRequest
0 голосов
/ 06 мая 2019

После небольшого исследования и с помощью другого человека мне удалось создать роль «Администратор» и назначить ее пользователю (мне был нужен только один администратор).Теперь у меня есть некоторые проблемы с перенаправлением входа на разные страницы, касающиеся роли пользователя.Я использую шаблон веб-сайта asp.net core 2.2 по умолчанию и аутентификацию, выбранную в качестве отдельной учетной записи пользователя.Вот мой метод CreateRole:

private async Task CreateUserRoles(IServiceProvider serviceProvider)
{
    var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
    var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();

    IdentityResult roleResult;
    //Adding Admin Role
    var roleCheck = await roleManager.RoleExistsAsync("Admin");
    if (!roleCheck)
    {
        //create the roles and seed them to the database
        roleResult = await roleManager.CreateAsync(new IdentityRole("Admin"));
    }
    //Assign Admin role to the main User here we have given our newly registered 
    //login id for Admin management
    ApplicationUser user = await userManager.FindByEmailAsync("example@gmail.com");
    await userManager.AddToRoleAsync(user, "Admin");
}

А вот пост моего метода входа в систему с тем, что я пробовал до сих пор:

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");

    if (ModelState.IsValid)
    {
        var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true);
        var status = await _signInManager.UserManager.GetUsersInRoleAsync("Admin");
        if (Input.Email.Contains(status.ToString()))
        {
            return LocalRedirect(returnUrl);
        }                
        if (result.Succeeded)
        {
            _logger.LogInformation("User logged in.");
            return LocalRedirect(returnUrl);
        }
        if (result.RequiresTwoFactor)
        {
            return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
        }
        if (result.IsLockedOut)
        {
            _logger.LogWarning("User account locked out.");
            return RedirectToPage("./Lockout");
        }
        else
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return Page();
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Вам нужно получить роль пользователя из базы данных:

var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true);
var user = await _signInManager.UserManager.FindByEmailAsync(Input.Email);
// Get the roles for the user
var roles = await _signInManager.UserManager.GetRolesAsync(user);

if (roles.Any(role=>"Admin".Equals(role)))
{
    return LocalRedirect("YourURL");
}

Или использовать функцию UserManager.IsInRoleAsync:

var user = await _signInManager.UserManager.FindByEmailAsync(Input.Email);

var isInRole = await _signInManager.UserManager.IsInRoleAsync(user, "Admin");
if (isInRole)
{
    return LocalRedirect("YourURL");
}
0 голосов
/ 06 мая 2019

Сразу после входа в систему вы можете проверить его роль, используя функцию HttpContext.User.IsInRole:

var user = await _userManager.FindByEmailAsync(Input.Email);
var result = await _signInManager.PasswordSignInAsync(user, Input.Password, Input.RememberMe, lockoutOnFailure: true);

if (result.Succeeded)
{
    _logger.LogInformation("User logged in.");
    var principal = await _signInManager.ClaimsFactory.CreateAsync(user);
    if (principal.IsInRole("Admin")) {
        return LocalRedirect("SomeSpecialUrlForAdmin");
    }
    else {
        return LocalRedirect(returnUrl);
    }
}
...