Harpreet_125 Ответов: 1

Перенаправлять пользователя на определенную страницу в зависимости от их роли в ASP.NET основной бритва


Я пытаюсь перенаправить пользователя на определенную страницу после входа в систему идентификации на основе ролей. Я использую идентификационный логин.

Ниже приведен код, который я пытаюсь использовать. Но это никуда меня не перенаправляет. Если я удаляю условия ролей, то это перенаправление.

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

        if (ModelState.IsValid)
        {
            // This doesn't count login failures towards account lockout
            // To enable password failures to trigger account lockout, set lockoutOnFailure: true
            var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false);

            if (result.Succeeded)
            {
                if(!string.IsNullOrEmpty(returnUrl))
                {
                    _logger.LogInformation("User logged in.");
                    if (User.IsInRole("Student"))
                    {
                        return Redirect("~/Student/Dashboard");
                    }
                    else if (User.IsInRole("Counsellor"))
                    {
                        return Redirect("~/Counsellor/Dashboard");
                    }
                    else if (User.IsInRole("School"))
                    {
                        return Redirect("~/School/Dashboard");
                    }
                    else if (User.IsInRole("Admin"))
                    {
                        return Redirect("~/Admin/Dashboard");
                    }


                }
                else

                {
                    _logger.LogInformation("User logged in.");
                    return LocalRedirect(returnUrl);

                }

               // 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();
    }


Что я уже пробовал:

if i do it like following then it is redirecting:

<pre lang="c#">if(!string.IsNullOrEmpty(returnUrl))
            {
                _logger.LogInformation("User logged in.");

                    return Redirect("~/Student/Dashboard");

            }


в чем причина этого и как я могу решить эту проблему?

F-ES Sitecore

У нас нет доступа к вашим учетным записям или учетным данным, мы не знаем ваших ролей или правильно ли все настроено, поэтому трудно сказать. Что я действительно советую вам сделать, так это использовать отладчик для пошагового просмотра вашего кода строка за строкой, чтобы увидеть, какой путь он принимает и чем этот путь отличается от того, что вы используете. например, если ваш IsInRole возвращает false, когда вы думаете, что это должно быть правдой, то вам нужно сосредоточиться на том, почему это происходит.

Harpreet_125

Он идет по правильному пути. Отладчик возвращает ложное значение для следующего кода.. вот в чем проблема.. но я не вижу ничего плохого..

если (пользователь.Метод Isinrole("Студент"))
{
return Redirect("~/Student/Dashboard");
}

1 Ответов

Рейтинг:
1

Member 14929169

//Ваше значение returnUrl всегда равно null.

public async Task<IActionResult> OnPostAsync(string returnUrl = null)//here you are setting null to returnUrl
    {
        returnUrl = returnUrl ?? Url.Content("~/"); //redirect to this url ("~/") if is null

        if (ModelState.IsValid)
        {
            // This doesn't count login failures towards account lockout
            // To enable password failures to trigger account lockout, set lockoutOnFailure: true
            var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false);

            if (result.Succeeded)
            {
                //if(!string.IsNullOrEmpty(returnUrl))//returnUrl = null, so will not enter to the if block, remove that block
                //{
                  //  _logger.LogInformation("User logged in.");
                    if (User.IsInRole("Student"))
                    {
                        return Redirect("~/Student/Dashboard");
                    }
                    else if (User.IsInRole("Counsellor"))
                    {
                        return Redirect("~/Counsellor/Dashboard");
                    }
                    else if (User.IsInRole("School"))
                    {
                        return Redirect("~/School/Dashboard");
                    }
                    else if (User.IsInRole("Admin"))
                    {
                        return Redirect("~/Admin/Dashboard");
                    }


                //}
               // else

                //{
					else{
                    _logger.LogInformation("User logged in.");
                    return LocalRedirect(returnUrl);//redirect to this page 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();
    }