惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
D
Darknet – Hacking Tools, Hacker News & Cyber Security
F
Fortinet All Blogs
小众软件
小众软件
博客园_首页
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Microsoft Azure Blog
Microsoft Azure Blog
MongoDB | Blog
MongoDB | Blog
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
量子位
N
Netflix TechBlog - Medium
B
Blog
P
Proofpoint News Feed
月光博客
月光博客
Apple Machine Learning Research
Apple Machine Learning Research
人人都是产品经理
人人都是产品经理
云风的 BLOG
云风的 BLOG
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
腾讯CDC
Engineering at Meta
Engineering at Meta
Y
Y Combinator Blog
AI
AI
Stack Overflow Blog
Stack Overflow Blog
U
Unit 42
M
MIT News - Artificial intelligence
Vercel News
Vercel News
D
DataBreaches.Net
P
Palo Alto Networks Blog
宝玉的分享
宝玉的分享
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Cisco Talos Blog
Cisco Talos Blog
T
Threatpost
The Hacker News
The Hacker News
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Security Latest
Security Latest
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
有赞技术团队
有赞技术团队
Attack and Defense Labs
Attack and Defense Labs
Recent Announcements
Recent Announcements
Hugging Face - Blog
Hugging Face - Blog
Webroot Blog
Webroot Blog
Cyberwarzone
Cyberwarzone
美团技术团队
博客园 - 司徒正美
Cloudbric
Cloudbric
J
Java Code Geeks
T
Tailwind CSS Blog
The Last Watchdog
The Last Watchdog
A
About on SuperTechFans

博客园 - 三生石上(FineUI控件)

ASP.NET Core如何禁用模型验证(或者从模型状态中移除某些属性)? 【WebForms王者归来】在 ASP.NET Core 中运行 WebForms 业务代码,99%相似度! FineUIPro/Mvc/Core v8.0.0 发布了! 【新特性速递】卡片式表格,Yeah~~~ 【新特性速递】更漂亮的主题风格(窈窕主题,君子好逑) 【新特性速递】左侧选项卡不再费脖子了 【上接 9 年前的一篇文章】动态创建控件的一个坑和解决方案 【新特性速递】类似Windows资源管理器的多选框 【新特性速递】填一个坑 - 修正页面中使用富文本编辑器时可能会被卡死的问题 【新特性速递】表格加载速度足足 3 倍提升,爱了爱了 FineUIPro/Mvc/Core v7.1.1 正式发布了! 【讨论】有哪些事你觉得ASP.NET Core MVC能做,而ASP.NET Core RazorPages做不了? 知识星球用户突破2000人! FineUIPro/Mvc/Core v7.1.0 正式发布了! FineUIPro/Mvc/Core v7.0.0 正式发布了! 【新特性速递】表格行分组(续) 【新特性速递】表格行分组(EnableRowGroup) 【新特性速递】树表格复选框与级联选择(TreeCheckBox,TreeCascadeCheck) 【新特性速递】平铺数字输入框的触发图标(NumberBoxTriggerType)
ASP.NET Core的全局拦截器(在页面回发时,如果判断当前请求不合法,不执行OnPost处理器)
三生石上(FineUI控件) · 2024-05-15 · via 博客园 - 三生石上(FineUI控件)

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();
        }
    }
}

微软官方文档:https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.filters.pagehandlerexecutingcontext?view=aspnetcore-8.0

上述文档中,在解释 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
{
...
}