Как сохранить параметр запроса ReturnUrl при отправке формы - PullRequest
0 голосов
/ 17 июня 2020

Я использую аутентификацию на основе cook ie с Razor Pages. Когда пользователь не имеет средства аутентификации ie в браузере и пытается получить доступ к бритвенной странице, например, с https://localhost:8080/admin/protected, по умолчанию основная структура as pnet перенаправляет на LoginPath, указанный в CookieAuthenticationOptions. Если этот URL-адрес похож на /login, тогда браузер автоматически перенаправляется на /login?ReturnUrl=%2Fadmin%2Fprotected

. Это прекрасно. Проблема в том, что я не знаю, как это должно работать позже, потому что, если моя страница /login бритвы отправляет форму (например, публикует имя пользователя и пароль), параметр ReturnUrl теряется.

Как «правильный» способ сохранить это? Я безуспешно пытаюсь найти что-то в документации, и я не могу найти никакого помощника по тегам asp.

PS: Я следовал этому как руководству: https://www.mikesdotnetting.com/article/335/simple-authentication-in-razor-pages-without-a-database

1 Ответ

0 голосов
/ 17 июня 2020

Я реализовал обходной путь, хотя он выглядит "хакерским", и я ожидал, что на страницах Razor будет какой-то синтаксис c, чтобы сохранить этот ReturnUrl. В любом случае решение состоит в том, чтобы включить в мою модель формы поле, в котором я буду хранить параметр запроса ReturnUrl при отображении страницы (например: Получить запрос). Например:

public class LoginForm
{
    public string ReturnUrl { get; set; } = string.Empty;
}

и код моей страницы бритвы:

public async Task OnGetAsync()
{
    var nameValueCollection = HttpUtility.ParseQueryString(Request.QueryString.Value);
    const string returnUrlKey = "returnUrl";
    var returnUrl = nameValueCollection.Get(returnUrlKey);
    LoginForm.ReturnUrl = returnUrl; //here I save the value on the form
    // do other things
}

Теперь на моей странице бритвы я добавляю скрытое поле, чтобы передать это значение обратно на сервер при отправке формы. . Например:

<form method="post">
  <input asp-for="LoginForm.ReturnUrl" type="hidden" />
  <button type="submit" asp-page-handler="Login">Login</button>
</form>

И затем я могу получить доступ к исходному значению в

public async Task<IActionResult> OnPostLoginAsync()
{
    if (!ModelState.IsValid)
    {
        return Page();
    }
    return Redirect(LoginForm.ReturnUrl);
}

Обратите внимание, что значение ReturnUrl сохраняется, даже если есть ошибка проверки и ModelState недействителен, чего я и хочу.

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