Как перенаправить на страницу или путь в ASP.NET Core Razor Pages - PullRequest
0 голосов
/ 27 января 2019

Итак, у меня есть это приложение, которое выглядит следующим образом:

Pages
 ├─Restricted
 │  ├─Index
 │  └─SecretPage
 ├─Index
 └─UserPage

Index страница позволяет анонимный доступ и имеет форму входа, UserPage страница может быть доступна любому аутентифицированному пользователю, и страницыв папке Restricted могут получить доступ только авторизованные пользователи.

Неаутентифицированный пользователь может попытаться получить доступ к странице UserPage или страницам в папке Restricted, но затем они будут перенаправлены на Indexстраниц (в корне) для входа в систему. В этом случае URL будет выглядеть примерно так: https://example.com/?returnUrl=UserPage или https://example.com/?returnUrl=Restricted.

Чтобы перенаправить пользователя после входа в систему, куда он хотел перейти, у меня былоследующий код:

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    var redirectTarget = string.Empty;

    // try to authenticate the user

    if (/* the log in attempt is successful */)
    {
        // do the log in stuff; i.e., Claims and SignInAsync

        redirectTarget = string.IsNullOrWhiteSpace(returnUrl) ? "UserPage" : returnUrl;
    }

    return RedirectToPage(redirectTarget);
}

Это прекрасно работает, пока returnUrl является страницей;Однако, когда returnUrl является папкой;например, Restricted, выдается «InvalidOperationException: ни одна страница с именем« / Restricted »не соответствует предоставленным значениям».

Итак, я переключился на Redirect(redirectTarget), но эта неправильно перенаправляет пользователя на Index/UserPageвместо UserPage, если returnUrl было null или пусто.Кроме того, это означает, что мне нужно жестко закодировать URL для входа / текущей страницы;т. е. /, вместо зависимости от метода перенаправления для перенаправления пользователя на ту же страницу в случае неудачной попытки входа в систему, например, что делает RedirectToPage.

Я могу решить перенаправление на UserPageвыдача с использованием /UserPage вместо UserPage;то есть, префикс это с /.Однако это означает, что веб-сайт не может быть размещен в виртуальном каталоге, поскольку UserPage не будет находиться в корне веб-сайта.

Любой чистый способ сделать такой вид перенаправления?

PS приложение использует ASP.NET Core 2.2, работающее на .NET Core 2.2.

...