.NetCore使用过滤器实现登录权限认证的方法小结

目录
  • 一、自定义行为过滤器在OnActionExecuting中实现
  • 二、自定义身份验证过滤器
  • 三、新建BaseController在OnActionExecuting中实现

本文实例环境及版本.NetCore3.1

实现系统登录验证方式个人总结如下:

1、自定义行为过滤器

2、自定义身份验证过滤器

3、新建BaseController在OnActionExecuting中实现

一、自定义行为过滤器在OnActionExecuting中实现

1、新建SystemAuthorizeFilter过滤器继承自 IActionFilter

/// <summary>
    /// 自定义行为过滤器,实现登录及权限的验证
    /// </summary>
    public class SystemAuthorizeFilter : IActionFilter
    {
        public void OnActionExecuted(ActionExecutedContext context)
        {
            //throw new NotImplementedException();
        }

        /// <summary>
        /// 在执行控制器中的Action方法之前执行该方法  判断当前用户是否登录
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuting(ActionExecutingContext context)
        {        //排除可以匿名访问的  未登录时
            if (HasAllow(context) == false && context.HttpContext.Session.GetString("User") == null)
            {
                bool isAjax = IsAjax(context.HttpContext.Request);

                //如果是Ajax请求自定义返回json
                if (isAjax)
                {
                    context.Result = new JsonResult(new { Code = 401, Msg = "登录已失效,请重新登录2!" }) {
                        StatusCode=StatusCodes.Status401Unauthorized
                    };
                }
                else
                {
                    ContentResult Content = new ContentResult();
                    Content.Content = "<script type='text/javascript'>alert('登录已失效,请重新登录!'); top.location.href='/Login/Login';</script>";
                    Content.ContentType = "text/html;charset=utf-8";
                    context.Result = Content;
                }
            }
        }
        /// <summary>
        /// 排除掉控制器不需要鉴权  即加[AllowAnonymous]特性的无需鉴权
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public static bool HasAllow(ActionExecutingContext context)
        {
            var filters = context.Filters;
            if (filters.OfType<IAllowAnonymousFilter>().Any())
            {
                return true;
            }
            var endpoint = context.HttpContext.GetEndpoint();
            return endpoint?.Metadata?.GetMetadata<IAllowAnonymous>() != null;
        }

        /// <summary>
        /// 判断是否是Ajax请求
        /// </summary>
        /// <param name="req"></param>
        /// <returns></returns>
        public static bool IsAjax(HttpRequest req)
        {
            bool result = false;
            var xreq = req.Headers.ContainsKey("x-requested-with");
            if (xreq)
            {
                result = req.Headers["x-requested-with"] == "XMLHttpRequest";
            }
            return result;
        }
    }

2、在Startup的ConfigureServices中添加

//配置系统过滤器
            services.AddControllersWithViews().AddMvcOptions(options =>
            {
                //自定义行为过滤器的方式,验证是否登录及用户权限
                options.Filters.Add<SystemAuthorizeFilter>();
            }).AddNewtonsoftJson(options=> {
                //全局日期格式化
                options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
                //返回的Json大小写原样输出
                options.SerializerSettings.ContractResolver = new DefaultContractResolver();
            });

3、在登录控制器如:LoginController.cs 或不需要鉴权的控制器或方法上添加[AllowAnonymous] 特性即可。

4、在页面上Ajax请求中加入判断如果返回的为401时给予提示并跳转至登录页面

$.ajax({
            type: "POST",
            data: "",
            async: false,
            dataType: "json",
            url: "",
            beforeSend: function () {
            },
            success: function (data) {
                if (data.Code != null && data.Code != "undefined" && data.Code == 401) {            alert('登录已失效,请重新登录!'); top.location.href='/Login/Login';          }                 console.log(data);             },             complete: function () { },             error: function (data) { }         });

二、自定义身份验证过滤器

新建CustomAuthorizeFilter过滤器继承自 IAuthorizationFilter

/// <summary>
    /// 自定义身份验证过滤器,实现登录及权限的验证
    /// </summary>
    public class CustomAuthorizeFilter : IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationFilterContext context)
        {
            //如果需要授权 但未登录
            if (HasAllowAnonymous(context) == false && context.HttpContext.Session.GetString("User") == null)
            {
                bool isAjax = IsAjax(context.HttpContext.Request);

                //如果是Ajax请求自定义返回json
                if (isAjax)
                {
                    context.Result = new JsonResult(new { Code = 401, Msg = "登录已失效,请重新登录2!" })
                    {
                        StatusCode = StatusCodes.Status401Unauthorized
                    };
                }
                else
                {
                    ContentResult Content = new ContentResult();
                    Content.Content = "<script type='text/javascript'> alert('登录已失效,请重新登录!'); top.location.href='/Login/Login'; </script>";
                    Content.ContentType = "text/html;charset=utf-8";
                    context.Result = Content;
                }
            }
        }

        /// <summary>
        /// 排除掉控制器不需要鉴权的
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        private static bool HasAllowAnonymous(AuthorizationFilterContext context)
        {
            var filters = context.Filters;
            if (filters.OfType<IAllowAnonymousFilter>().Any())
            {
                return true;
            }
            var endpoint = context.HttpContext.GetEndpoint();
            return endpoint?.Metadata?.GetMetadata<IAllowAnonymous>() != null;
        }
        /// <summary>
        /// 判断是否是Ajax请求
        /// </summary>
        /// <param name="req"></param>
        /// <returns></returns>
        public static bool IsAjax(HttpRequest req)
        {
            bool result = false;
            var xreq = req.Headers.ContainsKey("x-requested-with");
            if (xreq)
            {
                result = req.Headers["x-requested-with"] == "XMLHttpRequest";
            }
            return result;
        }

    }

使用方式同上,不需要鉴权的控制器或方法上添加[AllowAnonymous] 特性即可。

三、新建BaseController在OnActionExecuting中实现

在BaseController中重写OnActionExecuting方法

/// <summary>
        /// 在执行控制器中的Action方法之前执行该方法  判断当前用户是否登录
        /// </summary>
        /// <param name="context"></param>
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            if (context.HttpContext.Session.GetString("User")==null)
            {
                //context.Result = Redirect("/Login/Login");

                ContentResult Content = new ContentResult();
                Content.Content= "<script type='text/javascript'>alert('登录已失效,请重新登录!');top.location.href='/Login/Login'</script>";
                Content.ContentType = "text/html;charset=utf-8";
                context.Result = Content;

                return;
            }
        }

其他的修改可参考上面两种做补充,在需要鉴权的控制器上集成该BaseController即可。

到此这篇关于.NetCore使用过滤器实现登录权限认证几种方式总结的文章就介绍到这了,更多相关.NetCore登录权限认证内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • .NET webapi某化妆品直播卡死分析

    目录 一:背景 1. 讲故事 二:Windbg 分析 1. 线程们都怎么了 2. 单例写法真的没问题吗 3. 验证我的想法 4. 后续 三:总结 一:背景 1. 讲故事 10月份星球里的一位老朋友找到我,说他们公司的程序在一个网红直播带货下给弄得无响应了,无响应期间有大量的 RabbitMQ 超时,寻求如何找到根源,聊天截图我就不发了. 既然无响应了,那必然是程序的大量线程被主动或者被动的挂起,朋友也很及时的从程序上抽了一管血下来,接下来就上 windbg 一起探究下到底发生了什么? 二:Win

  • .NET CPU爆高事故事故分析某供应链WEB网站

    目录 一:背景 1. 讲故事 二:Windbg 分析 1. 查看CPU占用率 2. 查看是否 GC 触发 3. 是插入数据过多导致的吗? 4. 对问题的预判断 三:总结 一:背景 1. 讲故事 年前有位朋友加微信求助,说他的程序出现了偶发性CPU爆高,寻求如何解决,截图如下: 我建议朋友用 procdump 在 cpu 高的时候连抓两个dump,这样分析起来比较稳健,朋友也如期的成功抓到,接下来就用 windbg 一起来分析下吧. 二:Windbg 分析 1. 查看CPU占用率 先用 !tp 查

  • 一篇文章教你如何排查.NET内存泄漏

    目录 前言 检查托管内存使用 生成dump文件 分析 core dump 总结 前言 内存泄漏通常表示:一个应用程序的某些对象在完成它的的生命周期后,由于它被其他对象意外引用,导致后续gc无法对它进行回收,长此以往就会导致程序性能的下降以及潜在的 OutOfMemoryException. 这篇我们通过一个内存泄漏工具对 .NET Core 程序进行内存泄漏分析,如果程序是跑在windows上,那直接可以使用 Visual Studio 进行诊断. 检查托管内存使用 在开始分析内存泄漏之前,你一

  • .NET某消防物联网后台服务内存泄漏分析

    目录 一:背景 1. 讲故事 二:Windbg 分析 1. 托管还是非托管 2. 到底是什么在泄漏 3. 无引用根为什么不被回收 4. 寻找创建 COM 组件的线程 三:总结 一:背景 1. 讲故事 去年十月份有位朋友从微信找到我,说他的程序内存要炸掉了...截图如下: 时间有点久,图片都被清理了,不过有点讽刺的是,自己的程序本身就是做监控的,结果自己出了问题,太尴尬了

  • .NET内存泄漏分析Windbg项目实例

    一:背景 讲故事 上个月有位朋友找到我,说他的程序出现了内存泄漏,不知道如何进一步分析,截图如下: 朋友这段话已经说的非常言简意赅了,那就上 windbg 说话吧. 二:Windbg 分析 1. 到底是哪一方面的泄漏 根据朋友描述,程序运行一段时间后,内存就炸了,应该没造成人员伤亡,不然也不会跟我wx聊天了,这里可以用 .time 看看当前的 process 跑了多久. 0:000> .time Debug session time: Thu Oct 21 14:54:39.000 2021 (

  • MongoDB开启权限认证的方法步骤详解

    前言 最近在生产环境中MongoDB已经使用有一段时间了,但对于MongoDB的数据存储一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),最近在酷壳网看了一篇技术文章(https://coolshell.cn/?s=从+MONGODB+"赎金事件"+看安全问题&from=timeline&isappinstalled=0)介绍的mongodb未开启权限认证导致数据被黑客窃取,要比特币赎回的事件,考虑到数据安全的原因特地花了一点时间研究了一下,我现在用的版

  • Springboot+SpringSecurity+JWT实现用户登录和权限认证示例

    如今,互联网项目对于安全的要求越来越严格,这就是对后端开发提出了更多的要求,目前比较成熟的几种大家比较熟悉的模式,像RBAC 基于角色权限的验证,shiro框架专门用于处理权限方面的,另一个比较流行的后端框架是Spring-Security,该框架提供了一整套比较成熟,也很完整的机制用于处理各类场景下的可以基于权限,资源路径,以及授权方面的解决方案,部分模块支持定制化,而且在和oauth2.0进行了很好的无缝连接,在移动互联网的授权认证方面有很强的优势,具体的使用大家可以结合自己的业务场景进行选

  • 详解使用Spring3 实现用户登录以及权限认证

    使用Spring3 实现用户登录以及权限认证 这里我就简单介绍一下,我在实现的时候处理的一些主要的实现. 1.用户登录 <form action="loginAction.do" method="post"> <div class="header"> <h2 class="logo png"></h2> </div> <ul> <li><

  • MongoDB4.28开启权限认证配置用户密码登录功能

    目录 1.查看是否开启认证登录 2.开启用户名和密码认证(创建用户均需进入admin数据库) 2.1.为admin数据库创建管理员账号 2.2.为数据库mytest创建普通用户 2.3.配置文件开启用户名密码认证 3.重启mongo服务 4.mongo授权访问 4.1.admin数据库授权登录 4.1.mytest数据库授权登录 MongoDB默认不启用授权认证,只要能连接到该服务器,就可连接到mongod.若要启用安全认证,需要更改配置文件mongdb.conf中的参数auth. MongoD

  • springmvc集成shiro登录权限示例代码

    一般的登录流程会有:用户名不存在,密码错误,验证码错误等.. 在集成shiro后,应用程序的外部访问权限以及访问控制交给了shiro来管理. shiro提供了两个主要功能:认证(Authentication)和授权(Authorization);认证的作用是证明自身可以访问,一般是用户名加密码,授权的作用是谁可以访问哪些资源,通过开发者自己的用户角色权限系统来控制. shiro的会话管理和缓存管理不在本文范围内. 下面通过登录失败的处理流程来介绍springmvc与shiro的集成. 项目依赖:

  • SpringBoot集成Spring security JWT实现接口权限认证

    1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjw

  • SpringSecurity整合jwt权限认证的全流程讲解

    JWT 本文代码截取自实际项目. jwt(Json Web Token),一个token,令牌. 简单流程: 用户登录成功后,后端返回一个token,也就是颁发给用户一个凭证.之后每一次访问,前端都需要携带这个token,后端通过token来解析出当前访问对象. 优点 1.一定程度上解放了后端,后端不需要再记录当前用户是谁,不需要再维护一个session,节省了开销. 2.session依赖于cookie,某些场合cookie是用不了的,比如用户浏览器cookie被禁用.移动端无法存储cooki

  • Mongodb 3.2.9开启用户权限认证问题的步骤详解

    前言 大家在Mongodb安装好后,一般不需要用户名密码就可以直接使用,开发者认为只要使用环境足够安全,可以不使用认证,但是在实际使用中为了数据的安全,大多人还是选择了开启权限认证. 一.在老版的Mongodb(大概3.0以前)可以这样开启认证: 1.Linux环境下mongo shell方式认证: >show dbs ##看到有如下数据 admin (empty) comment 0.203125GB dbtest (empty) foo 0.203125GB local (empty) te

  • Java web过滤器验证登录防止未登录进入界面

    今天用ssh2写了个简单的系统,发现了一个问题,我这系统必须先登录成功才能进入主页,但我在浏览器里直接输入主页地址,发现也能进入,这个肯定不好,毫无安全性可言,后经查资料发现需要登录过滤器,就试了下,发现果然可以避免未经登录即可进入主页的危险,下面是我整理出的详细步骤: 1.首先写一个权限过滤filter类,实现Filter接口 import java.io.IOException; import javax.servlet.Filter; import javax.servlet.Filter

  • ThinkPHP权限认证Auth实例详解

    本文以实例代码的形式深入剖析了ThinkPHP权限认证Auth的实现原理与方法,具体步骤如下: mysql数据库部分sql代码: -- ---------------------------- -- Table structure for think_auth_group -- ---------------------------- DROP TABLE IF EXISTS `think_auth_group`; CREATE TABLE `think_auth_group` ( `id` m

随机推荐