Я хочу показать страницу, когда пользователи пытаются получить доступ к тому, что им не следует. Это ограничение - проверка в пользовательском промежуточном программном обеспечении. Когда промежуточное ПО возвращает 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, а затем вернуть пользовательское представление. Это вообще возможно? (Извините, если мой первый вопрос не был завершен)