C# 在不更改url的情况下获取要显示的自定义页面
我想在用户尝试访问他们不应该访问的内容时显示一个页面。此限制是签入自定义中间件。当中间件返回false并且调用新控制器时,我不希望客户端url发生更改 这是我的支票:C# 在不更改url的情况下获取要显示的自定义页面,c#,url,redirect,asp.net-core-mvc,C#,Url,Redirect,Asp.net Core Mvc,我想在用户尝试访问他们不应该访问的内容时显示一个页面。此限制是签入自定义中间件。当中间件返回false并且调用新控制器时,我不希望客户端url发生更改 这是我的支票: public异步任务调用(HttpContext上下文,IAutorisationService) { var user=service.CreateUserModel(上下文); var page=service.CreatePageModel(上下文); context.Items.Add(“CurrentUser”,user
public异步任务调用(HttpContext上下文,IAutorisationService)
{
var user=service.CreateUserModel(上下文);
var page=service.CreatePageModel(上下文);
context.Items.Add(“CurrentUser”,user);
if(service.UserAllowedToPage(用户,第页))
wait_next.Invoke(上下文);
其他的
{
Redirect(“/Error/CustomError”);
}
}
这是错误控制器:
public IActionResult CustomError()
{
if(!HttpContext.Items.TryGetValue(“CurrentUser”,out var o)| |!(o是UserModel UserModel))
{
返回视图();
}
if(userModel.issuerpuser)
{
返回视图();
}
这里返回的视图都很好
这是我的startup.cs(我现在在这里挣扎):
app.UseMvc(路由=>
{
//routes.MapRoute(
//名称:“错误路线”,
//模板:“{controller=Error}”,
//默认值:新建{controller=“Error”,action=“CustomError”});
routes.MapRoute(
名称:“默认”,
模板:“{controller=Home}/{action=Index}/{id?}”);
});
我在网上找到的任何一种组合似乎都不合适
更新
好吧,我不打算再谈这些政策了。
我会尽量更好地解释我的情况:
我在管道末端有一个自定义中间件(就在app.UseMvc之前)
该中间件有一个异步任务调用方法,该方法调用不同类中的布尔运算符。
现在,如果布尔值返回true,中间件任务将执行:wait\u next.Invoke(HttpContext)
,如果布尔值返回false,我希望中间件执行异常。
当抛出异常时,我需要:app.UseExceptionHandler(“/Error/CustomError”);
或app.useStatusCodePageSwithExecute(“/Error/CustomError”);
捕获它并在ErrorController中激活CustomError操作,然后返回自定义视图。这可能吗?(如果我的第一个问题没有完成,很抱歉)您好,您可以使用
return View("Error")
您可以随时检查所需内容,如果出现错误,而不是主视图,则可以返回错误视图。如果不更改URL,则无法重定向到页面。重定向实际上是在客户端进行的。服务器只需发送302响应,其中包含替代URL的
位置头。这是客户端的re负责实际请求该备用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(“重新执行”部分)
位将替换为HTTP状态码,HTTP状态码将是401 Unauthorized
。所以您可以将一个操作绑定到/error/401
,或者使用类似/error/{statusCode}的路由执行一个全面的操作
然后在状态代码内部分支以处理多种不同的错误类型。值得一提的是,这也是您提供自定义404页、500页等的方式
有关更多信息,请参阅:
这并不是我想要的答案。我知道我可以做到这一点,但我想在不更改url的情况下将用户重定向到自定义控制器+视图。我尝试了所有方法,但我发现UseStatusCodePagesWithReExecute不起作用,可能是因为它正在使用IIS Express运行?请确保您没有将其放在一个条件限制内t直接阻止它在开发中加载。除此之外,它几乎可以正常工作,因此不确定该告诉您什么。IIS Express不重要。状态代码页直接响应特定的状态代码,而不是异常。请尝试返回类似于new StatusCodeResult(401)的内容
。它不起作用,即使抛出异常,developerCeptionPage也没有捕获它。感觉它与管道中的位置有关,或者由于某种原因,我的整个设置没有通过我告诉他们使用的控制器捕获状态码或异常。