【鉴权/授权】自定义一个身份认证Handler

微信公众号:趣编程ACE
关注可了解.NET日常开发技巧。如需源码,请公众号留言 [源码];

上文回顾

【鉴权/授权】一步一步实现一个简易JWT鉴权

自定义身份验证CustomerAuthenticationHandler使用

上篇文章我演示了如何利用.net core 里面内置的验证方案-Bearer 进行身份验证,本文通过一个简单的例子来实现自定义身份验证流程。

超清观看哦~

首先创建一个登录服务

里面有三大步骤

1//Step1: 登录接口 需要在内置容器里面依赖注入2public interface ICustomerAuthentication3{4        ...5}67// 接口的实例8public class CustomerAuthentication : ICustomerAuthentication9{
10   // Step2:提供一个登录方法
11   public string Login(string userName, string password)
12   {
13
14   }
15}
16
17// Step3: 容器依赖注入
18builder.Services.AddSingleton<ICustomerAuthentication,CustomerAuthentication>();

登录接口实现

1// 相当于在内存里面定义一个用户对象集合 模拟从数据库查询获取用户对象 方便check2private readonly IDictionary<string,string> users = new Dictionary<string,string>3{4    {"p1","a1"},5    {"p2","a2"},6};7// 存放token集合8private readonly IDictionary<string,string> tokens = new Dictionary<string,string>();9public IDictionary<string,string> Tokens =>tokens; // 实现接口 并初始化
10
11public string Login(string userName, string password)
12{
13   // check 用户真实存在 
14   if(!users.Any(u=>u.Key==userName && u.Value==password))
15   {
16       return null;
17   }
18   // create token 通过一个Guid 类型的数据来代替token 仅为演示
19   var token = new Guid().ToString();
20   tokens.Add(token,userName);
21   return token ;
22}

创建一个自定义CustomerAuthenticationHandler类

1public class CustomerAuthenticationHandler :AuthenticationHandler<BasicAuthenticationOptions>
2{
3   ...
4}

其中CustomerAuthenticationHandler需要继承AuthenticationHandler接口,这个接口需要一个用于身份验证的Options配置类,所以需要定义一下BasicAuthenticationOptions 继承AuthenticationSchemeOptions

1public class BasicAuthenticationOptions :AuthenticationSchemeOptions
2{
3
4}

实现HandleAuthenticateAsync方法

1protected override async Task<AuthenticateResult> HandleAuthenticateAsync()2        {3            // throw new NotImplementedException();4            if(!Request.Headers.ContainsKey("Authorization"))5            {6                return AuthenticateResult.Fail("UnAuthorized");7            }89            // 获取请求头里面 Authorization对应的value
10            string authenticationHeader = Request.Headers["Authorization"];
11            if(string.IsNullOrEmpty(authenticationHeader))
12            {
13                return AuthenticateResult.Fail("UnAuthorized");
14            }
15            if(!authenticationHeader.StartsWith("Bearer",StringComparison.OrdinalIgnoreCase))
16            {
17                return AuthenticateResult.Fail("UnAuthorized");
18            }
19            // 获取token
20            string token = authenticationHeader.Substring("bearer".Length).Trim();
21            if(string.IsNullOrEmpty(token))
22            {
23                return AuthenticateResult.Fail("UnAuthorized");
24            }
25
26            try
27            {
28                // 验证token 调用下方ValidateToken() 这个方法
29                return ValidateToken(token);
30            }
31            catch (System.Exception ex)
32            {
33                // 记录日志
34                return AuthenticateResult.Fail("UnAuthorized");
35            }
36        }
37
38private AuthenticateResult ValidateToken(string token)
39        {
40           var validateToken = _customerAuthentication.Tokens.FirstOrDefault(t=>t.Key ==token);
41           if(validateToken.Key is null )
42           {
43               return AuthenticateResult.Fail("UnAuthorized");
44           }
45           var claims = new List<Claim>
46           {
47               new Claim(ClaimTypes.Name,validateToken.Value)
48           };
49
50           var identity = new ClaimsIdentity(claims,Scheme.Name);
51           var principle = new GenericPrincipal(identity,null);
52           var ticket = new AuthenticationTicket(principle,Scheme.Name);
53           return AuthenticateResult.Success(ticket);
54        }

该方法返回一个AuthenticateResult类型的对象来表示身份验证是否成功,如果成功,需要将这个票据返还给用户。
那么为啥需要票据呢?因为我们在Http传输协议下,需要保证附加在请求头或者请求参数的内容的安全性,所以需要将principal对象包裹成AuthenticationTicket对象,在后者里面我们可以增加一些安全配置。

DI中注册认证服务

1// 自定义验证 取名为一个 test 的Scheme方案
2builder.Services.AddAuthentication("test") 
3    .AddScheme<BasicAuthenticationOptions,CustomerAuthenticationHandler>("test",null);

PS:本文来自社区群粉丝投稿~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java把对象转成json_java 把对象 对象转换成json字符串 | 学步园

publicclassJSONCreateDemoActivity {//创建以下的JSON对象publicString createJSONObject() {Gsongson newGson();Configurationcon1 newConfiguration();con1.setDisplay(true);con1.setFillColor("#FF0000");con1.setID(1);con1.setLineColor("#FF0000&quo…

【C语言简单说】六:取模运算符以及变量的扩展

┴┴ &#xff08;╰(&#xff40;□′)╯&#xff08; ┴┴ … 这一节我们就来说另外的运算符——取模运算符&#xff08;说白了跟取余数差不多…&#xff1c;—_-)&#xff01;&#xff01;&#xff01;&#xff09; 先看看好难懂的定义&#xff1a;取模运算和取余运算两个…

Android Studio开发基础之Activity之间参数传递

一、简单数值传递 1、MainActivity protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {@Overridepublic void o…

ExtJs5.0在WebStorm上的使用之入门教程(一)编写第一个网页 HelloExt

首先&#xff0c;必须声明一下笔者使用的软件版本&#xff1a; 前端开发工具&#xff1a;WebStorm 11.0.3 辅助插件&#xff1a;ext-5.0.0-gpl 以上工具包括下面的代码我已经打包上传在此处了&#xff1a;点击打开链接 先上代码&#xff0c;再废话&#xff1a;<!DOCTYPE htm…

python赋值语句的一般格式为_[零基础学Python]赋值,简单也不简单

变量命名在《初识永远强大的函数》一文中&#xff0c;有一节专门讨论“取名字的学问”&#xff0c;就是有关变量名称的问题&#xff0c;本温故而知新的原则&#xff0c;这里要复习&#xff1a;名称格式&#xff1a;(下划线或者字母)(任意数目的字母&#xff0c;数字或下划线)注…

linux之下载文件或测试网络常用命令(curl和wget)

1 问题 在自己的设备上测试网络 2 解决办法 1)使用wget命令(主要用来下载文件或测试网络) 一般用使用 wget www.baidu.com 效果如下: wget www.baidu.com --2018-12-04 23:48:23-- http://www.baidu.com/ Resolving www.baidu.com (www.baidu.com)... 14.215.177.38, 14…

腾讯视频涨价:一年多赚74亿!关注我领取腾讯VIP会员,周卡低至7元

不久前&#xff0c;腾讯视频的用户又一次“喜迎会员价格上涨”&#xff0c;甚至让腾讯视频因此登上了微博热搜。但要知道的是&#xff0c;此前在去年4月的时候&#xff0c;腾讯视频就已经涨过一次价了。4月9日&#xff0c;腾讯视频方面发布通知称&#xff0c;将于4月20日零点调…

RAID 01 和RAID 10的区别

之前没搞明白&#xff0c;今天看了篇文章&#xff0c;终于清楚了。RAID 01 就是先做RAID 0磁盘组&#xff0c;再2组RAID 0做成RAID 1。这种情况下&#xff0c;RAID 1 的其中一个镜像 RAID 0中,有一块盘坏掉,RAID 1 的其中一个镜像就全坏了。RAID 10,就是先做1&#xff0c;再2组…

使用JUnitParams简化Parameterized tests

为什么80%的码农都做不了架构师&#xff1f;>>> 序 junit4的Parameterized tests的使用方法太过费劲了&#xff0c;这里介绍下如何使用JUnitParams来简化Parameterized tests。 junit4原生的Parameterized tests实例 RunWith(Parameterized.class) public class Fi…

无约束优化问题求解(4):牛顿法后续

目录 前言SR1, DFP, BFGS之间的关系 BB方法Reference 前言 Emm&#xff0c;由于上一篇笔记的字数超过了要求&#xff08;这还是第一次- -&#xff09;&#xff0c;就把后续内容放到这篇笔记里面了&#xff0c;公式的标号仍然不变&#xff0c;上一篇笔记的连接在这&#xff1a;…

【C语言简单说】七:自定义函数(1)

在最开始的说过&#xff0c;函数可以比喻工具箱&#xff0c;那么我们现在开始自己开始制作函数了&#xff0c;自己制作函数是很简单的&#xff0c;如下代码&#xff1a; #include<stdio.h> #include<stdlib.h> //头文件下面 void dy(){printf("这里是dy函数\…

哈夫曼编码算法 java_我所知道的算法之哈夫曼编码

上一篇文章中提到数据结构&#xff1a;哈夫曼树&#xff0c;今天接着学习由哈夫曼提出编码方式&#xff0c;一种程序算法。简称&#xff1a;哈夫曼编码一、什么是哈夫曼编码&#xff1f;与哈夫曼树一样&#xff0c;会不会有小伙伴对哈夫曼编码很陌生&#xff0c;有疑惑问题疑惑…

Windows之Wireshake之抓HTTP请求包(过滤目的IP)

1 问题 用Wireshake抓取HTTP请求包 2 解决办法 直接在在WireShare里面过滤条件输入http 然后在浏览器输入http的请求,我的效果如下 看吧,都是http请求 如果数据太多,我只需要过滤一个目的的ip,我们可以这样设置参数 ip.addr == 目的ip && http 如下图 然后我输…

html使用element ui_Kendo UI for jQuery使用教程:自定义小部件(二)

Kendo UI目前最新提供KendoUI for jQuery、KendoUI for Angular、KendoUI Support for React和KendoUI Support for Vue四个控件。Kendo UI for jQuery是创建现代Web应用程序的完整UI库。Kendo UI通过继承基本窗口小部件类为您提供创建自定义窗口小部件的选项。处理事件1. 将更…

ASP.NET MVC 个人学习笔记之 Controller传值

2019独角兽企业重金招聘Python工程师标准>>> //ControllerViewBag.Message "Modify this template to jump-start your ASP.NET MVC application."; // View<section class"featured"><div class"content-wrapper"><…

Dapr 和 Spring Cloud 对比分析

很多人都是使用SpringBoot 和 Spring Cloud来开发微服务。Dapr 也是开发微服务的框架&#xff0c;它和Spring Cloud有什么区别呢&#xff0c;其实这不是一个区别的问题&#xff0c;它是不同的时代需要不同的框架。Spring Cloud 是一种产品&#xff0c;提供了分布式应用程序所需…

【C语言简单说】七:自定义函数(2)

刚刚说了如何自定义函数。那只是最简单的形式&#xff0c;那我们现在开始来说函数的返回值。我们先贴上之前的代码&#xff1a; #include<stdio.h> #include<stdlib.h> //头文件下面 void dy(){printf("这里是dy函数\n");} //main函数上面 int main() …

判断只有符号数字 java_java编程 判断输入的字符,数字,及其他符号的个数

package 判断字符;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class test {public static void main(String[] args) {test t new test();t.test();}public void test(){StringProcess sp new StringProcess();try …

jdk源码分析书籍 pdf_什么?Spring5 AOP 默认使用Cglib?从现象到源码深度分析

推荐阅读&#xff1a;阿里工作十年拿下P8&#xff0c;多亏了这些PDF陪我成长&#xff08;Spring全家桶源码解析Redis实战等&#xff09;​zhuanlan.zhihu.com从入门到熟悉&#xff0c;一步一步带你了解 MySQL 中的「索引」和「锁」​zhuanlan.zhihu.comSpring5 AOP 默认使用 Cg…

Window之Fiddler构建请求

1 问题 1) 我们在浏览器访问普通地址抓包正常,然后在代理后台wget url也正常,但是在浏览器输入代理地址没有返回数据 分析:我们在pc端抓取浏览器访问普通地址正常包(用Wireshare),得到数据包1,然后在代理后台使用wget url正常的时候,用tcpdump抓包,得到数据包2,然后…