前言

有这样一种场景,就是新项目已经集成了认证中心,或者是都用了统一的认证方式(比如现在常用的JWT),这样对于项目之间的对接就显得比较方便,至少在认证这块还是能减少一些工作量的。但当上线的老项目需要对接新项目时,由于有些老项目通常会个性化的生成Token或者是通过一些标识传到后台进行认证,再加上老项目运行稳定和投入人力比较少的情况,很多时候都需要新的项目兼容老的认证方式,这个时候就可以考虑自定义的认证方式了。

正文

其实主要的原理就是根据项目的认证传参情况,从请求头或请求参数中取出对应的Token或标识进行验证即可;和很多小伙伴们一样,一开始想到的方法是通过授权过滤器的方式实现即可,但其实可以模仿AddJwtBearer的认证方式自己实现一个,主要的逻辑就是继承AuthenticationHandler之后,在HandleAuthenticateAsync方法中编写自己的验证就OK了,详细步骤如下:

1. 编写验证逻辑

这里还是创建一个WebAPI项目进行演示

1.1 定义自己的AuthenticationScheme

就像Bearer一样,定义自己的Scheme,在这个类里也可以定义需要的配置信息,可以在验证逻辑的时候用到,如下:

1.2 继承AuthenticationHandler编写自己的验证逻辑

添加一个类继承自AuthenticationHandler,重写HandleAuthenticateAsync方法,在里面可以写和业务相关的任何验证逻辑:

1.3 定义一个扩展方法,像AddJwtBearer一样使用

为了方便调用,按照规范为AuthenticationBuilder定义一个扩展方法:

2. 使用自定义的认证方式

上面的验证逻辑都写完了,接下来就像使用JWT认证一样直接使用即可,由于演示环境用的.NET5,在Startup.cs中注册相关服务和加上对应的认证中间件就行。

然后在需要认证控制器或Action方法上打上Authorize属性就行啦:

以上就是自定义认证方式的使用步骤,是不是很简单,来试一下效果:

加上Token再试试:

用Postman组装请求头试试,如下:

在请求头中加个Token再试试,如下:

好了,自定义认证的思路就是这样,只需要根据项目对接的情况,在校验逻辑那块改成项目实际的场景即可。

源代码地址:

https://gitee.com/CodeZoe/dot-net-core-study-demo/tree/main/CustomAuth

总结

以上方案其实在之前的项目也使用到了,最近对接新老系统时,又需要这块,间隔时间有点长,有一些小细节忘了,所以赶紧记录一下,下次直接翻文章就行啦。

关注“Code综艺圈”,和我一起学习吧。

.NET自定义认证虽然简单,但好用的更多相关文章

  1. ocelot 自定义认证和授权

    ocelot 自定义认证和授权 Intro 最近又重新启动了网关项目,服务越来越多,每个服务都有一个地址,这无论是对于前端还是后端开发调试都是比较麻烦的,前端需要定义很多 baseUrl,而后端需要没 ...

  2. asp.net core 自定义认证方式--请求头认证

    asp.net core 自定义认证方式--请求头认证 Intro 最近开始真正的实践了一些网关的东西,最近写几篇文章分享一下我的实践以及遇到的问题. 本文主要介绍网关后面的服务如何进行认证. 解决思 ...

  3. 【Spring Security】六、自定义认证处理的过滤器

    这里接着上一章的自定义过滤器,这里主要的是配置自定义认证处理的过滤器,并加入到FilterChain的过程.在我们自己不在xml做特殊的配置情况下,security默认的做认证处理的过滤器为Usern ...

  4. springSecurity自定义认证配置

    上一篇讲了springSecurity的简单入门的小demo,认证用户是在xml中写死的.今天来说一下自定义认证,读取数据库来实现认证.当然,也是非常简单的,因为仅仅是读取数据库,权限是写死的,因为相 ...

  5. Laravel 认证原理及完全自定义认证

    Laravel 默认的 auth 功能已经是很全面了,但是我们也经常会碰到一些需要自定义的一些情况,比如验证的字段和默认的不匹配,比如需要能够同时满足 user name 和 email 认证等等.如 ...

  6. django 自定义认证

    在Django中自定义身份验证 Django 自带的认证系统足够应付大多数情况,但你或许不打算使用现成的认证系统.定制自己的项目的权限系统需要了解哪些一些关键点,即Django中哪些部分是能够扩展或替 ...

  7. 带入gRPC:对 RPC 方法做自定义认证

    带入gRPC:对 RPC 方法做自定义认证 原文地址:带入gRPC:对 RPC 方法做自定义认证项目地址:https://github.com/EDDYCJY/go... 前言 在前面的章节中,我们介 ...

  8. Spring Security自定义认证页面(动态网页解决方案+静态网页解决方案)--练气中期圆满

    写在前面 上一回我们简单分析了spring security拦截器链的加载流程,我们还有一些简单的问题没有解决.如何自定义登录页面?如何通过数据库获取用户权限信息? 今天主要解决如何配置自定义认证页面 ...

  9. 跟我一起学Go系列:Go gRPC 安全认证方式-Token和自定义认证

    Go gRPC 系列: 跟我一起学Go系列:gRPC安全认证机制-SSL/TLS认证 跟我一起学 Go 系列:gRPC 拦截器使用 跟我一起学 Go 系列:gRPC 入门必备 接上一篇继续讲 gRPC ...

随机推荐

  1. GO语言学习——运算符

    运算符 Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 算术运算符 运算符 描述 + 相加 - 相减 * 相乘 / 相除 % 求余 注意: ++(自增)和--(自 ...

  2. redis的zset数据结构:跳表

    点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. 广州这边封闭式管理好久了,今天终于周末可以出去溜溜了 什么是zset z ...

  3. linux创建磁盘阵例10

    Linux创建RAID10 生产环境中用到的服务器一般都配备RAID阵列卡,尽管服务器的价格越来越便宜,但是我们没有必要为了做一个实验而去单独购买一台服务器,而是可以学会使用mdadm命令在Linux ...

  4. SpringBoot 如何进行参数校验

    为什么需要参数校验 在日常的接口开发中,为了防止非法参数对业务造成影响,经常需要对接口的参数进行校验,例如登录的时候需要校验用户名和密码是否为空,添加用户的时候校验用户邮箱地址.手机号码格式是否正确. ...

  5. [AcWing 823] 排列

    点击查看代码 #include<iostream> using namespace std; const int N = 10; int n; void dfs(int u, int nu ...

  6. Linux进程总结

    一个执着于技术的公众号 进程 进程,是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.它的执行需要系统分配资源创建实体之后,才能进行.举个例子: ...

  7. 版本控制之git

    1.Git的介绍 Git 是一个开源的分布式版本控制软件,用以有效.高速的处理从很小到非常大的项目版本管理. Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发.Git ...

  8. redis 2 主从和哨兵

    主从: 概念:将一台redis服务器数据复制到其他redis服务器,前者是master,后者是slave.数据复制是单向,从主节点复制到从节点.master以写为主,slave以读为主一个zhu主节点 ...

  9. Fluent-Validator 业务校验器

    Fluent-Validator 业务校验器 背景 在互联网行业中,基于Java开发的业务类系统,不管是服务端还是客户端,业务逻辑代码的更新往往是非常频繁的,这源于功能的快速迭代特性.在一般公司内部, ...

  10. 141. Linked List Cycle - LeetCode

    Question 141. Linked List Cycle Solution 题目大意:给一个链表,判断是否存在循环,最好不要使用额外空间 思路:定义一个假节点fakeNext,遍历这个链表,判断 ...