ASP.NET Core的全局拦截器(在页面回发时,如果判断当前请求不合法,不执行OnPost处理器)
ASP.NET Core RazorPages中,我们可以在页面模型基类中重载OnPageHandlerExecuting方法。
下面的例子中,BaseModel继承自 PageModel,是所有页面模型的基类。
推荐方案:
在BaseModel.cs中,重载OnPageHandlerExecuting方法(看下面代码中的注释):
public override void OnPageHandlerExecuting(PageHandlerExecutingContext context)
{
base.OnPageHandlerExecuting(context); if (IsPostBack)
{
// 回发请求时,检索请求数据或者Cookie,来验证当前访问是否有效。请求无效时,弹出错误提示,不再执行Page_Load和回发事件。
if (!String.IsNullOrEmpty(Request.Query["error"]))
{
ShowNotify("身份验证失败!"); // Setting Result to a non-null value inside a page filter will short-circuit the page and any remaining page filters.
// 设置context.Result=UIHelper.Result(),可以中断页面继续执行(跳过接下来的 Page_Load 和回发事件)。
context.Result = UIHelper.Result();
}
}
}
上述文档中,在解释 Result 属性时,专门提到了这个事情:

在页面过滤器内将 Result 设置为非空值将使该页面和任何剩余的页面过滤器短路。
延伸阅读
===================
其实上述方案在6年前发布 AppBoxCore 时已经存在了,只不过在 AppBoxCore 中做的更加工程化,也更加清晰。
当前的需求是要求有些页面需要进行身份验证,而一些公开的页面不需要身份验证。
1. 我们首先定义 CheckPowerAttribute 过滤器。
namespace AppBoxCore.Dapper
{
/// <summary>
/// AppBoxCore自定义权限验证过滤器
/// </summary>
public class CheckPowerAttribute : ResultFilterAttribute
{
/// <summary>
/// 权限名称
/// </summary>
public string Name { get; set; } public override void OnResultExecuting(ResultExecutingContext filterContext)
{
HttpContext context = filterContext.HttpContext;
// 权限验证不通过
if (!String.IsNullOrEmpty(Name) && !BaseModel.CheckPower(context, Name))
{
if (context.Request.Method == "GET")
{
BaseModel.CheckPowerFailWithPage(context); // -修正越权访问页面时会报错[服务器无法在发送 HTTP 标头之后追加标头](龙涛软件-9374)。
filterContext.Result = new EmptyResult();
}
else if (context.Request.Method == "POST")
{
BaseModel.CheckPowerFailWithAlert();
filterContext.Result = UIHelper.Result();
}
}
} }
}
参考文档:http://stackoverflow.com/questions/9837180/how-to-skip-action-execution-from-an-actionfilter
这个文档也相关有参考价值,当时遇到一个报错:
服务器无法在发送 HTTP 标头之后追加标头
如果需要在 GET 请求中结束当前请求,也需要设置 new EmptyResult()。
2. 然后需要进行身份验证的页面,在页面模型上定义此属性即可。
比如 Admin 目录下的 Config 页面:
[CheckPower(Name = "CoreConfigView")]
public class ConfigModel : BaseAdminModel
{
...
}
ASP.NET Core的全局拦截器(在页面回发时,如果判断当前请求不合法,不执行OnPost处理器)的更多相关文章
- asp.net mvc core 管道以及拦截器初了解
今天来看一下asp.net core的执行管道.先看下官方说明: 从上图可以抛光,asp.net core的执行顺序是,当收到一个请求后,request请求会先经过已注册的中间件,然后会进入到mvc的 ...
- Struts2 全局拦截器、result 的实现
定义一个可以继承的包,在这个包里面写入自己常用的拦截器,于是就实现了全局拦截器的实现. 现在,我们定义一个专门用来继承的包: <!--专门提供前台继承的包--> <package n ...
- springMVC的全局拦截器
先说说为什么要使用springMVC的全局拦截器,比如 当我们在访问接口的时候,我们一般都会先判断这个用户是否登陆,我们就要在每个接口的前面都要判断一下,想想是不是很蛋疼,那工作量... 这时候,我们 ...
- struts2 全局拦截器,显示请求方法和參数
后台系统中应该须要一个功能那就是将每一个请求的url地址和请求的參数log出来,方便系统调试和bug追踪,使用struts2时能够使用struts2的全局拦截器实现此功能: import java.u ...
- wepy全局拦截器
wepy有支持全局拦截器,但是请求需要使用wepy.request().then(): 在app.wpy文件中配置以下内容,与data同级 constructor(){ super(); this.u ...
- vue-resource 全局拦截器
项目中可能会添加超时登录的功能,因此根据tokenid 判断是否超时.如果token已过期,需要跳转至登录页面. 因此需要用到全局拦截器拦截返回的状态 //下边代码添加在main.js中 Vue.ht ...
- asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密。
原文:asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密. GitHub demo https://github.com/zhanglilong23/Asp.NetCore. ...
- struts2 全局拦截器,显示请求方法和参数
后台系统中应该需要一个功能那就是将每个请求的url地址和请求的参数log出来,方便系统调试和bug追踪,使用struts2时可以使用struts2的全局拦截器实现此功能: import java.ut ...
- 如何在ASP.NET Core 2.0中使用Razor页面
如何在ASP.NET Core 2.0中使用Razor页面 DotNetCore2017-11-22 14:49 问题 如何在ASP.NET Core 2.0中使用Razor页面 解 创建一个空的项 ...
- asp.net core使用中间件美化开发环境异常页面
asp.net core系统自带的异常页面色彩给人感觉模糊.朦胧,晕眩! 原版: 美化版 实现思路:(在系统自带异常中间件“DeveloperExceptionPageMiddleware”执行后,调 ...
随机推荐
- #树状数组#洛谷 5677 [GZOI2017]配对统计
题目 分析 考虑处理出所有右端点的能够匹配的左端点,然后用树状数组离线查询 代码 #include <cstdio> #include <cctype> #include &l ...
- 3. Vector Spaces and Subspaces
3.1 Vector Spaces The space \(R^n\) consists of all colunm vectors \(v\) with n components. We can a ...
- WPS HW 漏洞 学习
复现过程 2023 年 HW 出现 WPS 0day POC 影响版本: WPS Office 2023个人版<11.1.0.15120 WPS Office 2019企业版<11.8.2 ...
- Causal Inference理论学习篇-Tree Based-Causal Tree
Tree-Based Algorithms Tree-based这类方法,和之前meta-learning 类的方法最明显的区别是: 这类方法把causal effect 的计算显示的加入了到了树模型 ...
- spring boot 学习前提
前言 总结spring boot的学习前提. 正文 1.spring 程度(可以基本使用,我在学习spring boot的时候,感觉到需要一些spring的基础) 2.maven (这个是包管理,一定 ...
- redis 简单整理——redis 的集合基本结构和命令[五]
前言 简单介绍一下集合的基本结构和命令. 正文 集合(set)类型也是用来保存多个的字符串元素,但和列表类型不一 样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过 索引下标获取元素. ...
- node require的循环引用是怎么一回事
require 运行过程 require 引用是同步的,没有异步这么一说,它会先运行一遍. setouttime(function(){ export=a; }) 如果我们require的时候,那么这 ...
- szfpga 高云gowin国产开发板GW2AR-18核心板fpga cpld测试板
1. 概述 国产FPGA是最近几年起来的产品,具有性价比高特点.而GOWIN属于国产FPGA成员,在服务和芯片都是比较大的优势,很多用户都用在LED控制,电机控制,PLC设备上,以及用于替换Latti ...
- 高云GOWIN下载出现No devices found咋办
在使用GOWIN下载器下载会出现该类问题 No devices found错误. 原因如下: A . Windows10 系统会出现下载器通道顺序错误,所以要确保在 A 通道上. B.有一些 USB ...
- vue项目如何部署?有遇到布署服务器后刷新404问题吗?
一.如何部署 前后端分离开发模式下,前后端是独立布署的,前端只需要将最后的构建物上传至目标服务器的web容器指定的静态目录下即可 我们知道vue项目在构建后,是生成一系列的静态文件 常规布署我们只需要 ...