漫谈认证与授权

漫谈认证与授权

Intro

认证与授权一直以来都是很多人在讨论的话题,之所以想这次谈一谈认证和授权,主要是因为最近看到许多文章都把认证和授权混为一谈,把认证方式当作是授权方式。所以想写篇文章谈谈我眼中的认证与授权。

Authentication

什么是认证?认证是一个尝试解决我是谁的问题的过程。

以一个 HTTP 请求为例,认证就是 尝试 从请求信息中获取用户信息的过程,

有一点需要特别注意:认证并不等于一定有用户信息,有些文章直接把认证等同于有用户信息,再次强调,认证就是认证,一定有用户信息就相当于是要授权了,有用户信息只能说明某种认证方式认证成功了,经过某种方式认证之后,还是没有用户信息,只能说明这种认证方式认证失败,认证失败并不代表授权失败。

认证的方式可以多种多样,而且我们可以同时使用多种认证方式:比如说 Cookie 认证、JWT 认证 以及其他自定义 Token 认证,之所以称之为认证方式,是因为他们只提供解决我是谁的解决方案,比如 Cookie 认证会尝试从 HTTP 请求携带的 Cookie 信息中获取用户信息,而 JWT 则是从 Authorization 请求头中的 Bearer Token 获取用户的信息,自定义的Token 也类似。

甚至我们可以做一些扩展,做一些不一样的认证,比如说根据 Header/QueryString Authentication,我在我们的项目里就是这么做的,网关解析出用户信息之后转发给下游服务的请求会把用户信息放在请求头里,我们自定义了一个 HeaderAuthentication 从请求头中获取用户的信息,我们下游服务就可以用 HeaderAuthentication 替换原来使用的 JWT 认证,这样 JWT 只需要在网关处认证一次即可,下游服务不再需要验证 token 的有效性以及解析这个 token。

之前提供了一个开源版本的 Header/QueryString Authentication 的实现,实现源码:https://github.com/WeihanLi/AspNetCorePlayground/tree/master/WeihanLi.AspNetCore.Authentication

Authorization

什么是授权?授权顾名思义就是授予权限,允许查看或进行某种操作。

授权是尝试对用户授予访问或操作权限的过程

如果一个资源是允许匿名访问的,那么无论认证成功与否,无论有没有用户信息,都是可以授权访问的

如果一个资源是需要用户有某个角色(Manager)才能访问的,那么首先我们应该先通过认证获取用户的信息,再判断用户是否有这个角色,如果有这个角色则允许授权,否则都不应授权访问。

  • 如果认证失败就没有用户信息,没有用户信息,自然不可能具备 Manager 的角色,这时候就不应该授权访问,如果用户没有认证成功,则需要用户提供有效的认证信息(用户可能没有提供认证信息,也有可能是 token 过期等认证信息无效的错误),这时一般 Web 框架会返回 401 Unauthorized ,

  • 如果用户认证成功了,但是没有相应的角色 Manager,这种情况 Web 框架一般会返回 403 Forbidden

  • 如果用户认证成功了,并且拥有 Manager 的角色,则说明用户是有权限访问资源的,这时应该授权用户访问。

一点唠叨:

允许匿名访问、需要用户登录才能访问、需要某种角色才能访问等这些都属于授权,不属于认证,就像允许匿名访问,没有用户信息也可以访问,但是并不影响认证的过程,用户认证成功还是有用户信息的。

Summary

认证是一个尝试解决我是谁的问题的过程。

授权是尝试对用户授予访问或操作权限的过程

More

最后安利一下,自己做的一个关于授权的项目 AccessControlHelper

AccessControlHelper 一个基于策略的授权解决方案,最早是基于 asp.net mvc 做的,实现了可以控制对 Action 的访问和页面上某个元素的访问(Conditional Server Render),后来.netcore2.0 发布之后也支持了 .netcore,.netcore 下的支持更多一点,支持 .net core 下的 TagHelper 和 Policy,现在的实现还有不太好,感兴趣的可以上去看看,欢迎 issue/pr ...

Github: https://github.com/WeihanLi/AccessControlHelper

Reference

  • https://github.com/WeihanLi/AspNetCorePlayground/tree/master/WeihanLi.AspNetCore.Authentication

  • https://github.com/WeihanLi/AccessControlHelper

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

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

相关文章

Java基础知识——Sting、StringBuild、StringBuffer的区别

String类是不可变类,任何对String的改变都会引发新的String对象的生成; StringBuffer是可变类,任何对它所指代的字符串的改变都不会产生新的对象,线程安全的。 StringBuilder是可变类,线性不安全的,不支持并…

【译】gRPC vs HTTP APIs

本文翻译自 ASP.NET Blog | gRPC vs HTTP APIs,作者 James,译者 Edison Zhou。现在,ASP.NET Core使开发人员可以构建gRPC服务。gRPC是一个远程过程调用框架,专注于高性能和开发人员的生产力。ASP.NET Core 3.0中集成了gRPC&#x…

.NET Core 3.0 的新改进:针对分布式应用程序的故障诊断和监控

由于分布式应用是由多个组件组成的,且这些组件往往是由不同的团队拥有和操作,所以在与应用程序发生交互时,就会需要跨多个组件执行代码的分布式跟踪。如果用户遇到了问题,想要确定是哪个组件出现了差错,基本就是一件不…

Java Object有哪些公用方法?

protected Object clone() 创建并返回此对象的一个副本。 boolean equals(Object obj) 指示某个其他对象是否与此对象“相等”。 protected void finalize() 当垃圾回收器确定不存在对该对象的更多引用时&#xff0c;由对象的垃圾回收器调用此方法。 Class<? extends Objec…

【翻译】.NET Core3.1发布

.NET Core3.1发布我们很高兴宣布.NET Core 3.1的发布。实际上&#xff0c;这只是对我们两个多月前发布的.NET Core 3.0的一小部分修复和完善。最重要的是.NET Core 3.1是长期支持&#xff08;LTS&#xff09;版本&#xff0c;并且将支持三年。和过去一样&#xff0c;我们希望花…

JVM(1)——JVM内存分区

一、JVM简介 JVM&#xff0c;即Java虚拟机&#xff08;Java Virtual Machine&#xff09;&#xff0c;一种能够运行Java bytecode的虚拟机&#xff0c;是Java实现跨平台的基础。 引入Java语言虚拟机后&#xff0c;Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚…

使用Azure Pipelines从GitHub发布NuGet包

[本文目录]ps: 阅读本文大概需要20分钟欢迎大家点击上方公众号链接关注我&#xff0c;了解新西兰码农生活什么是 YAML?name/value 名称/值collections 集合multiple data types 复合数据类型comments 注释Pipelines 的 YAML 结构在 Azure DevOps Pipelines 中创建第一个任务为…

JVM(2)——JVM类加载机制

一、JVM类加载机制简介 虚拟机把描述类的数据从Class文件加载到内存&#xff0c;并对数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的Java类型&#xff0c;这就是虚拟机的类加载机制。 在Java语言里面&#xff0c;类型的加载和连接过程都是在程序运…

PYPL 12月榜单发布,编程语言、IDE与数据库市场如何?

PYPL&#xff08;PopularitY of Programming Language&#xff0c;编程语言流行指数&#xff09;12 月份的榜单已经发布了。PYPL 是非常流行的参考指标&#xff0c;其榜单数据的排名均是根据榜单对象在 Google 上相关的搜索频率进行统计排名&#xff0c;原始数据来自 Google Tr…

JVM(3)——JVM类加载器

一、类加载器简介 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现&#xff0c;以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块被称为“类加载器”。 类加载器虽然只用于实现类的…

.NET Core应用框架AA介绍(二)

AA的开源地址https://github.com/ChengLab/AAFrameWork AA框架是一个基础应用框架&#xff0c;是建立在众多大家熟知的流行工具之上并与之集成。比如&#xff1a;ASP.NET Core、Automapper、Dapper、Dapper-FluentMap、RabbitMQ、Redis、MassTransit、Log4net等等大家可以很方便…

JVM(4)——对象访问

一、对象创建过程在Java语言中&#xff0c;对象是如何访问的呢&#xff1f;对象访问在Java语言中无处不在&#xff0c;是最普通的程序行为&#xff0c;但即使是最简单的访问&#xff0c;也会涉及Java虚拟机栈、Java堆区、方法区。 对于下面这行代码&#xff0c; Object obj ne…

Java BIO、NIO、AIO的区别

一、基础概念 同步&#xff1a;是指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪。 异步&#xff1a;是指用户进程触发IO操作以后便开始做自己的事情&#xff0c;而当IO操作已经完成的时候会得到IO完成的通知&#xff08;异步的特点就是通知&#xff09;。&…

鹅厂后台开发工程师的工作日常

写在前面 &#xff1a;本故事纯属虚构&#xff0c;如有雷同&#xff0c;不负责任。为了整理 Linux 开发和日常使用的常用命令&#xff0c;想了好几天才串了这么个故事。虽然有点牵强&#xff0c;但是内容还是挺干的~欢迎大家点评。在很久很久以前&#xff0c;鹅厂开发类工程师职…

.NET Core开发的iNeuOS工业互联网平台,发布 iNeuDA 数据分析展示组件,快捷开发图形报表和数据大屏...

经过一段时间的努力&#xff0c;iNeuDA产品组件已经开发和测试完成&#xff0c;现在正式上线。现在iNeuOS工业互联网操作系统的技术体系和产品体系更佳完善&#xff0c;为中小企业提供更佳全面解决方案。如下图&#xff1a;iNeuDA 一站式大数据分析平台作为国内领先的新一代自助…

asp.net core 从 3.0 到 3.1

asp.net core 从 3.0 到 3.1Intro今天 .net core 3.1 正式发布了&#xff0c;.net core 3.1 正式版已发布&#xff0c;3.1 主要是对 3.0 的 bug 修复&#xff0c;以及一些小优化&#xff0c;而且作为 LTS 版本&#xff0c;建议大家升级。值得一提的是.net core 2.2 这个月就要寿…

Mac(OS X)必备软件

常有人说Mac上面软件少&#xff0c;没有Windows上面软件丰富&#xff0c;其实除了少数特定基于Windows平台的软件除外&#xff0c;其他软件都能在Mac上找到其相应版本或其他替代软件。本篇就Mac上常用软件做一下总结。 第一类&#xff1a;聊天/通讯 1、QQ QQ for Mac保留和QQ一…

身边的设计模式(三):抽象工厂 与 依赖注入

上篇文章&#xff0c;我们说到了简单工厂和工厂方法&#xff0c;如果没看过的&#xff0c;请先看上篇&#xff0c;不然的话&#xff0c;可能有些吃力&#xff0c;或者直接点击阅读原文&#xff0c;查看我博客园的对应详细版的文章。大家学到了这里&#xff0c;我建议自己可以练…

Java基础知识——Java集合详解

数组是Java很常见的一种数据结构&#xff0c;能够快速地进行存取。但是当遇到下面几种情况&#xff1a; ①我们需要存储的数据集数目是不定的 ②我们希望数据集能够自动排序 ③我们需要以键值对的方式存储数据 … 数组就不能满足我们的需求了。这时候&#xff0c;我们就需要使用…