Получение настраиваемой страницы для отображения без изменения URL - PullRequest
1 голос
/ 01 июля 2019

Я хочу показать страницу, когда пользователи пытаются получить доступ к тому, что им не следует. Это ограничение - проверка в пользовательском промежуточном программном обеспечении. Когда промежуточное ПО возвращает false и вызывается новый контроллер, я не хочу, чтобы URL-адрес на стороне клиента изменился.

Это моя проверка промежуточного программного обеспечения:

public async Task Invoke(HttpContext context, IAutorisationService service)
        {
            var user = service.CreateUserModel(context);
            var page = service.CreatePageModel(context);
            context.Items.Add("CurrentUser", user);

            if (service.UserAllowedToPage(user, page))
                await _next.Invoke(context);
            else
            {
                context.Response.Redirect("/Error/CustomError");
            }
        }

Это контроллер ошибок:

public IActionResult CustomError()
        {
            if (!HttpContext.Items.TryGetValue("CurrentUser", out var o) || !(o is UserModel userModel))
            {
                return View();
            }

            if (userModel.IsSuperUser)
            {
                return View();
            }

Все возвращенные здесь представления работают нормально.

Это мой startup.cs (где я сейчас борюсь):

app.UseMvc(routes =>
            {
                //routes.MapRoute(
                    //name: "ErrorRoute",
                    //template: "{controller=Error}",
                    //defaults: new {controller = "Error", action = "CustomError"});

                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");

            });

Я просто не могу понять это правильно с любой комбинацией, которую я нахожу в сети.

Обновление

Хорошо, так что я не буду больше рассказывать о политике. Я попытаюсь объяснить мою ситуацию немного лучше: У меня есть пользовательское промежуточное ПО в конце конвейера (как раз перед app.UseMvc) Это промежуточное программное обеспечение имеет асинхронный метод вызова задач, который вызывает логический оператор в другом классе. Теперь, если логическое значение возвращает true, задача промежуточного программного обеспечения выполняет: await _next.Invoke(HttpContext), и я хочу, чтобы промежуточное программное обеспечение выполнило исключение, если это логическое значение возвращает false. И когда выдается исключение, я хочу: app.UseExceptionHandler("/Error/CustomError"); или app.UseStatusCodePagesWithReExecute("/Error/CustomError"); чтобы поймать его и активировать действие CustomError в ErrorController, а затем вернуть пользовательское представление. Это вообще возможно? (Извините, если мой первый вопрос не был завершен)

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Вы не можете перенаправить на страницу, не изменив URL. Перенаправление на самом деле происходит на стороне клиента. Сервер просто отправляет ответ 302 с заголовком Location, содержащим альтернативный URL. Клиент обязан сделать запрос на этот альтернативный URL-адрес, что по умолчанию делают браузеры. В результате браузер будет буквально запрашивать /Error/CustomError.

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

Вместо этого вы должны использовать встроенную структуру авторизации. Вы можете применять настраиваемые политики к контроллерам / действиям, реализуя требования и обработчики, а затем ссылаясь на политику с атрибутом Authorize:

[Authorize(Policy = "MyPolicy")]
public IActionResult MyProtectedAction()

Затем, когда пользователь не сможет выполнить требования политики, он попадет в промежуточное программное обеспечение для обработки исключений, где вы можете связать свое собственное представление с помощью настройки app.UseStatusCodePagesWithReExecute:

public class Startup
{
    ...

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseStatusCodePagesWithReExecute("/error/{0}");

        ...
    }
}

Это затем выполнит контроллер и действие, определенные для маршрута /error/{0}, без влияния на URL (часть «ReExecute»). Бит {0} будет заменен кодом состояния HTTP, который будет 401 Unauthorized. Таким образом, вы можете буквально связать действие с /error/401 или действие перехватить все с таким маршрутом, как /error/{statusCode}, а затем перейти внутрь кода состояния для обработки множества различных типов ошибок. Для чего бы это ни стоило, это также, как вы бы предоставили пользовательские 404 страницы, 500 страниц и т. Д.

Для получения дополнительной информации см .:

0 голосов
/ 01 июля 2019

привет, вы можете вернуться к просмотру ошибок, используя

return View("Error")

, вы можете проверить все, что вам нужно, и, если что-то не так, вместо основного просмотра вы можете вернуть представление ошибок

...