ASP.NET mvc 自定义验证和Filter过滤器传参

简介: 在WEBfrom时代 membership作为系统默认的身份验证提供程序,貌似很好用,但ASP.NET没有开源,我们又不能百分之百的按照微软默认商务方式去进行验证,有无力去彻底重写这个东西,所以membership一直是个鸡肋,但随着ASP.

      在WEBfrom时代 membership作为系统默认的身份验证提供程序,貌似很好用,但ASP.NET没有开源,我们又不能百分之百的按照微软默认商务方式去进行验证,有无力去彻底重写这个东西,所以membership一直是个鸡肋,但随着ASP.NETmvc的开源,这个东西真的派上了用场,而且比以前更加的强大

    在应该用程序中,身份验证和各种各样的验证一直都是系统一个很重要的东西,在ASP.NETmvc中这些被整体打包成为过滤器,感觉其创意来源于IIS的管道模型

 

主要有一下这几个东西

FilterAttribute,ActionFilterAttribute,AuthorizeAttribute                 可以继承重写

IActionFilter, IResultFilter, IExceptionFilter, IAuthorizationFilter    接口可以定义自己的实现

网上有个不错的关系图

201012292142451306

 

刚一开始,我一直纳闷为什们系统自己的FILTER可以传参数

而卧自己继承重写和自己实现的咋就是不能传参了,这个时候终于感受到开源的伟大,看了一些源码终于知道怎么搞了

就是在类中定义公开的属性例如下面的实现的接口

 

例如 继承重写

  public class MyActionFilter:ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            filterContext.RequestContext.HttpContext.Response.Write(string.Format("1执行"));
            base.OnActionExecuted(filterContext);
        }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.RequestContext.HttpContext.Response.Write(string.Format("2执行"));
            base.OnActionExecuting(filterContext);
        }

        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            filterContext.RequestContext.HttpContext.Response.Write(string.Format("3执行"));
            base.OnResultExecuted(filterContext);
        }

        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            filterContext.RequestContext.HttpContext.Response.Write(string.Format("4执行"));
            base.OnResultExecuting(filterContext);
        }





    }


    public class MyAuthorization : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            return base.AuthorizeCore(httpContext);
        }
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            base.HandleUnauthorizedRequest(filterContext);
        }

        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);
        }

        protected override HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext)
        {
            return base.OnCacheAuthorization(httpContext);
        }


    }

还有实现接口自定义自己的验证方式

  public class MyFilter : FilterAttribute, IActionFilter, IResultFilter, IExceptionFilter, IAuthorizationFilter
     {


         private string _roles;
         private string[] _rolesSplit = new string[0];
         private string _users;
         private string[] _usersSplit = new string[0];

          //过滤器但参数就是过滤器中定义的公开的参数
         public string Roles
         {
             get
             {
                 return _roles ?? String.Empty;
             }
             set
             {
                 _roles = value;
                // _rolesSplit = SplitString(value);
             }
         }

         public string Users
         {
             get
             {
                 return _users ?? String.Empty;
             }
             set
             {
                 _users = value;
                // _usersSplit = SplitString(value);
             }
         }


        #region IActionFilter 成员

        public void OnActionExecuted(ActionExecutedContext filterContext)
         {
             filterContext.RequestContext.HttpContext.Response.Write(string.Format("Action({0})已经执行了!<br />"
                 ,filterContext.ActionDescriptor.ActionName));
         }

        public void OnActionExecuting(ActionExecutingContext filterContext)
         {
             filterContext.RequestContext.HttpContext.Response.Write(string.Format("Action({0})执行之前!<br />"
                 ,filterContext.ActionDescriptor.ActionName));
         }

        #endregion


        #region IResultFilter 成员

        public void OnResultExecuted(ResultExecutedContext filterContext)
         {
             filterContext.RequestContext.HttpContext.Response.Write("Result已经执行了!");
         }

        public void OnResultExecuting(ResultExecutingContext filterContext)
         {
             filterContext.RequestContext.HttpContext.Response.Write("Result执行之前!");
         }

        #endregion

        #region IExceptionFilter 成员

        public void OnException(ExceptionContext filterContext)
         {
            string controller = filterContext.RouteData.Values["controller"] as string;
            string action = filterContext.RouteData.Values["action"] as string;

             filterContext.RequestContext.HttpContext.Response.Write(string.Format("{0}:{1}发生异常!{2}",
                 controller,action, filterContext.Exception.Message));
             filterContext.ExceptionHandled = true;
         }

        #endregion

        #region IAuthorizationFilter 成员

        public void OnAuthorization(AuthorizationContext filterContext)
         {
             filterContext.HttpContext.Response.Write("执行authorization! 判断时候有权限。。。。<br />");
         }

        #endregion

        
     }
test
目录
打赏
0
0
0
0
8
分享
相关文章
|
4月前
|
.net 自定义日志类
在.NET中,创建自定义日志类有助于更好地管理日志信息。示例展示了如何创建、配置和使用日志记录功能,包括写入日志文件、设置日志级别、格式化消息等。注意事项涵盖时间戳、日志级别、JSON序列化、线程安全、日志格式、文件处理及示例使用。请根据需求调整代码。
77 13
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
113 5
|
6月前
|
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
113 1
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
275 0
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
104 0
CNN依旧能战:nnU-Net团队新研究揭示医学图像分割的验证误区,设定先进的验证标准与基线模型
在3D医学图像分割领域,尽管出现了多种新架构和方法,但大多未能超越2018年nnU-Net基准。研究发现,许多新方法的优越性未经严格验证,揭示了验证方法的不严谨性。作者通过系统基准测试评估了CNN、Transformer和Mamba等方法,强调了配置和硬件资源的重要性,并更新了nnU-Net基线以适应不同条件。论文呼吁加强科学验证,以确保真实性能提升。通过nnU-Net的变体和新方法的比较,显示经典CNN方法在某些情况下仍优于理论上的先进方法。研究提供了新的标准化基线模型,以促进更严谨的性能评估。
261 0
老程序员分享:NSIS自定义界面,下载并安装Net.Framework4.8
老程序员分享:NSIS自定义界面,下载并安装Net.Framework4.8
.NET下 支持大小写不敏感的JSON Schema验证方法
有很多应用程序在验证JSON数据的时候用到了JSON Schema。 在微服务架构下,有时候各个微服务由于各种历史原因,它们所生成的数据对JSON Object属性名的大小写规则可能并不统一,它们需要消费的JSON数据的属性名可能需要大小写无关。 遗憾的是,目前的JSON Schema没有这方面的标准,标准中都是大小写敏感的。在类似上述情况下,这给使用JSON Schema进行数据验证造成了困难。

热门文章

最新文章