ASP.NET Core 自定义认证方式--请求头认证

Intro

最近开始真正的实践了一些网关的东西,最近写几篇文章分享一下我的实践以及遇到的问题。

本文主要介绍网关后面的服务如何进行认证。

解决思路

网关可以做一部分的认证和授权,服务内部有时候也会需要用户的信息,这时该怎么办呢,我们使用的是 JWT 认证,有一个 identity server去颁发,验证 token,一种简单方式可以把 token 直接往后传,传递给后面的具体某个服务,后面的服务可以去 identity server 拿到公钥信息去验证 token 的合法性,依然可以拿到用户的一些基本信息,但又觉得这样后面的服务还是要依赖 identityserver 不是太好,因为认证已经在网关做掉了,后面不应该再去做认证的事情了,而且解析 JWT token 也是有一定的性能损耗,于是想把用户的基本信息在网关认证完成之后放到请求头中。

我们网关用的Ocelot,开源的原生 .NET 项目方便自己扩展,Ocelot 中有一个 Claims2Headers 可以把 Claims 中的信息转换为请求头,详细使用参见文档,但是实现有个bug,如果有多个值他只会取第一个,详见issue,可以自己扩展一个 ocelot 的中间件替换掉原有的中间件。

把用户信息放到请求头中,后面的服务从请求头中就可以拿到用户的基本信息了,为了后面的服务不做过多的改动,我做了一个自定义的认证,从请求头中拿用户的基本信息进行认证,这样后面的服务还是可以直接使用 User.Identity.IsAuthenticated 和 User.Identity.Name 等,不需要做什么改动。于是就有了这一根据请求头认证的项目

实现效果

下载示例项目,在 TestWebApplication 目录下运行 dotnet run

在浏览器中访问 http://localhost:5000/api/values

640?wx_fmt=png

使用 postman 或 fiddler (或其它你喜欢的工具)带上 header 访问 http://localhost:5000/api/values

640?wx_fmt=png

使用方式

使用方式可以参考示例项目

使用自定义的 HeaderAuthentication 来替代之前的认证方式,默认配置了用户名,用户id以及用户角色,如果不能满足可以在 options 中的 AdditionalHeaderToClaims 中添加更多转换

640?wx_fmt=png

这样就可以了,你可以下载示例项目,快速体验,你可以直接添加下面几个请求头

UserId 用户id
UserName 用户名称
UserRoles 用户角色(多个角色以 , 分割,可以在 options 里自定义多个值的分隔符

直接访问需要授权才能访问的资源了

现在只是初步的设想与实现,并已经验证确实可行,代码还有一些业务逻辑比如 UserId 现在是必须的,可以根据自己需要自行修改,最近有点忙,找时间再修改重构一下再发布 nuget 包。如果有什么需求或问题,欢迎一起探讨。

源码

自定义认证源码

提供了 HeaderAuthetication 和 QueryAuthentication 两种实现,一种使用请求头信息认证,一种使用 QueryString 信息认证。

HeaderAuthetication 主要实现在 HeaderAuthenticationHandler

核心代码,重写 Authenticate 方法:

640?wx_fmt=png

640?wx_fmt=png

注意

请注意,如果使用这种方式,请确保你的服务不会被外界直接访问,请求只能从网关或者本地调试发起。需要保证安全性,不能直接暴露到公网,才能使用这种方式。

原文地址:https://www.cnblogs.com/weihanli/p/10464507.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
640?wx_fmt=jpeg


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

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

相关文章

P7516 [省选联考 2021 A/B 卷] 图函数

解析 纯纯的人类智慧题。 关键性质:vvv 可以在计算 f(u,G)f(u,G)f(u,G) 时产生贡献,当且仅当 GGG 中 u,vu,vu,v 之间可以通过 [v,n][v,n][v,n] 的点互相到达。 充分性较为显然,编号更大的点不会比 vvv 先删去,所以必然在 vvv 时…

开发语言大爆炸的时代,究竟谁主沉浮?

开发语言大爆炸的时代,究竟谁主沉浮?当这个系列本来打算是写人物的,而且是写我们身边那些优秀的开发者,然而当第一篇文章,写的是关于我们长沙.NET社区的优秀开发者邹琼俊,发表在博客园之后,有一…

Asp.NETCore轻松学系列阅读指引目录

前言耗时两个多月,坚持写这个入门系列文章,就是想给后来者更好更快的上手体验,这个系列可以说是从入门到进阶,适合没有 .NETCore 编程经验到小白同学,也适合从 .NET Framework 迁移到 .NETCore 的朋友。本系列从安装环…

eShopOnContainers 知多少[9]:Ocelot gateways

引言客户端与微服务的通信问题永远是一个绕不开的问题,对于小型微服务应用,客户端与微服务可以使用直连的方式进行通信,但对于对于大型的微服务应用我们将不得不面对以下问题:如何降低客户端到后台的请求数量,并减少与…

Acwing 1072. 树的最长路径

Acwing 1072. 树的最长路径 题意: 每个边有权值,求树的直径 题解: 两遍dfs可以求,这里用树形dp的方法,我们将1作为根节点来看这棵树 我们可以将点看作是钉子,边就是挂在钉子上的绳子,我们只…

.NET/C# 获取一个正在运行的进程的命令行参数

在自己的进程内部,我们可以通过 Main 函数传入的参数,也可以通过 Environment.GetCommandLineArgs 来获取命令行参数。但是,可以通过什么方式来获取另一个运行着的程序的命令行参数呢?进程内部获取传入参数的方法,可以…

听说,霸都.NET技术社区准备搞线下聚会了?

.NET Core实战项目交流群日常交流嗨,你听说了没有?霸都.NET技术社区准备搞线下聚会了!啥时候的事情啊?最近才知道的消息啊!那你是从哪里知道的消息呢?.NET Core项目实战交流群(637326624&#x…

P4383 [八省联考 2018] 林克卡特树(wqs二分、树形dp)

解析 它还真的不难。 乐。 这题没做出来有些谔谔。 外层wqs二分显而易见,里面不知道为啥我总觉得这个题可以贪心。 然后一直试图在原树直径上下功夫,一筹莫展。 看到题解“dp”两个字这题也就做完了… 就相当于要把一棵树分成若干条无交链,每…

ASP.NET Core中实现单体程序的事件发布/订阅 - LamondLu - 博客园

标题:ASP.NET Core中实现单体程序的事件发布/订阅作者:Lamond Lu地址:https://www.cnblogs.com/lwqlun/p/10468058.html项目源代码:https://github.com/lamondlu/EventHandlerInSingleApplication背景事件发布/订阅是一种非常强大…

Joy of Handcraft Gym - 102822J(线段树或差分)

Joy of Handcraft Gym - 102822J 题意: 每个灯有亮的周期和亮度,问1~m这段时间灯光最亮是多少 题解: 线段树维护区间最大值 根据灯的周期向这段区间加亮度k,然后利用线段树维护区间最大值 但是这样会超时,加个小优…

.NET Core 使用 HttpClient SSL 请求出错的解决办法

问题使用 HTTP Client 请求 HTTPS 的 API 时出现 The certificate cannot be verified up to a trusted certification authority 异常,并且证书已经传入。下面就是问题代码:public class Program{public static void Main(string[] args){var url &quo…

微软4年后重登市值第一,纳德拉如何做到的?

他用4年多时间将微软的市值提高了5000亿美元,超越苹果再次成为全球市值最高的上市公司。译 | 达达萨提亚纳德拉(Satya Nadella)2014年刚刚执掌微软时,微软当时是一个日渐没落的帝国。但在他领导的4年多时间里,微软百花…

【.NET Core项目实战-统一认证平台】第十五章 网关篇-使用二级缓存提升性能

首先说声抱歉,可能是因为假期综合症(其实就是因为懒哈)的原因,已经很长时间没更新博客了,现在也调整的差不多了,准备还是以每周1-2篇的进度来更新博客,并完成本项目所有功能。言归正传&#xff…

NET Core微服务之路:简单谈谈对ELK,Splunk,Exceptionless统一日志收集中心的心得体会...

前言日志,一直以来都是开发人员和运维人员最关心的问题。开发人员可通过日志记录来协助问题定位,运维人员可通过日志发现系统隐患,故障等定位问题。如果你的系统中没有日志,就像一个断了线的风筝,你永远不知道它会的落…

.NET Core 中的 Generic Host快速使用指南

本文以自己在工作中学习和使用.net core generic-host 作一个总结。前言在创建的ASPNETCORE项目中,我们可以在Main()中看见,我们通过IWebHostBuild创建了一个IWebHost,而微软提供了WebHost.CreateDefaultBuilder(args)来帮助我们更轻松得创建…

微软一顿操作猛如虎,PowerShell 排名直线上升

近日,TIOBE 发布了 2019 年 3 月编程语言排行榜,PowerShell 首次进入到了榜单的 Top 50 中,排在第 45 位。PowerShell 是运行在 Windows 操作系统上实现对系统以及应用程序进行管理自动化的命令行脚本环境。(PowerShell 排在了 TI…

AcWing 201. 可见的点

AcWing 201. 可见的点 题意: 题解: 我们先说结论:坐标(i,j),如果i和j互质,说明该坐标为可见 为什么? 我们想想什么样的坐标可见,什么样的会被挡住。光线是一个直线,在同一个直线上的点会被第一…

ocelot 自定义认证和授权

Intro最近又重新启动了网关项目,服务越来越多,每个服务都有一个地址,这无论是对于前端还是后端开发调试都是比较麻烦的,前端需要定义很多 baseUrl,而后端需要没有代码调试的时候需要对每个服务的地址都收藏着或者记在哪…

CF765F Souvenirs(势能线段树)

CF765F Souvenirsproblemsolutioncodeproblem 题目链接 solution 这个势能线段树简直是太巧妙了!!!( ఠൠఠ )ノ 将询问按右端点升序离线下来。 对于每一个右端点 rrr,维护 ansimin⁡{∣ai−aj∣,j∈[i,r]}ans_i\m…

AcWing 220. 最大公约数

AcWing 220. 最大公约数 题意&#xff1a; 题解&#xff1a; 题目就变成了AcWing 201. 可见的点 当然有微调&#xff0c;因为可见的点里面是从0开始&#xff0c;本题从1开始&#xff0c;所以本题中phi[1]认为是0 AcWing 201. 可见的点的题解 代码&#xff1a; #include<b…