Бритва PageModel RedirectToRouteResult не работает при вызове OnPost - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь реализовать простой Asp. net основной поток входа в веб-приложение.

Модель входа в систему

namespace Trading_System.UI.Pages.Account
{
    public class LoginModel : PageModel
    {

        [BindProperty]
        public string Username { get; set; }

        [BindProperty]
        public string Password { get; set; }

        public string ReturnUrl { get; set; }

        public string ErrorMessage { get; set; }

        private IUserManager m_userManager;

        public LoginModel(IUserManager userManager)
        {
            m_userManager = userManager;
        }

        public void OnGet(string returnUrl)
        {
            ReturnUrl = returnUrl;
        }

        public async Task<IActionResult> OnPost()
        {
            var user = m_userManager.GetUser(Username, Password);
            if (user == null)
            {
                ErrorMessage = "Username or password are invalid.";
                return Page();
            }

            var claims = new List<Claim>()
            {
                new Claim(ClaimTypes.NameIdentifier, user.UserName)
            };

            var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);

            var principal = new ClaimsPrincipal(identity);

            await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);

            return new RedirectToRouteResult(ReturnUrl);
        }

        public async Task<IActionResult> OnPostLogout(string returnUrl)
        {
            await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);

            return new RedirectToPageResult("/index");
        }
    }
}

Код html для входа в систему

@page
@model Account.LoginModel
@{
    ViewData["Title"] = "Login";
}

<div class="login-page">
    <div class="page-header">
        <h1>Login</h1>
    </div>

    <div class="row">
        <div class="col-sm-6">
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h3 class="panel-title">Please enter your credentials</h3>
                </div>
                <div class="panel-body">
                    <form method="post">
                        <fieldset>
                            <div class="form-group">
                                <label asp-for="Username"></label>
                                <input class="form-control" placeholder="Username" asp-for="Username" autofocus>
                            </div>
                            <div class="form-group">
                                <label asp-for="Password"></label>
                                <input type="password" class="form-control" placeholder="Password" asp-for="Password" autocomplete="off">
                            </div>
                            <div class="form-group">
                                <button class="btn btn-primary">Login</button>
                            </div>
                            @if(!string.IsNullOrEmpty(Model.ErrorMessage))
                            {
                                <div class="alert alert-warning">@Model.ErrorMessage</div>
                            }
                        </fieldset>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>

Я устанавливаю свойство ReturnUrl при вызове OnGet (например, "https://localhost: 44389 / Account / Login? ReturnUrl =% 2FSecretPage ") Но я также пытался установить его вручную, чтобы проблемы не было.

После того, как я нажал «Войти», меня перенаправили на страницу входа в систему независимо от того, что задано ReturnUrl (я вижу в chrome ответ 302). URL после отправки: "https://localhost: 44389 / Аккаунт / Логин? Длина = 14 "

Что я делаю не так? Я просто хочу перенаправить обратно на маршрут, по которому я был до перенаправления на страницу входа.

1 Ответ

0 голосов
/ 26 апреля 2020

RedirectToRouteResult выполняет перенаправление на маршрут , где маршрут является именованным маршрутом, настроенным через маршрутизатор MVC.

Как показывает ваш пример, ReturnUrl который передается вашему действию входа в систему, является относительным URL: /Account/Login?ReturnUrl=%2FSecretPage. Так что ReturnUrl - это "/SecretPage".

Относительный URL-адрес обычно равен именованному маршруту, поэтому использование RedirectToRoute здесь не сработает. Вместо этого вы можете вернуть LocalRedirectResult:

return LocalRedirect(ReturnUrl);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...